1  /* PR target/85323 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2 -mavx512vl -mavx512bw -fdump-tree-optimized" } */
       4  
       5  #include <x86intrin.h>
       6  
       7  struct S1 { __m128i a, b, c, d, e, f, g, h, i; } s1;
       8  struct S2 { __m256i a, b, c, d, e, f, g, h, i; } s2;
       9  struct S3 { __m512i a, b, c, d, e, f, g, h, i; } s3;
      10  
      11  /* { dg-final { scan-tree-dump-times "s1.a = \{ -4342213319840130048, -761680639942076944 \};" 1 "optimized" } } */
      12  /* { dg-final { scan-tree-dump-times "s1.b = \{ 16777216, 149499221639168 \};" 1 "optimized" } } */
      13  /* { dg-final { scan-tree-dump-times "s1.c = \{ 2623346860254860648, -763360136839241728 \};" 1 "optimized" } } */
      14  /* { dg-final { scan-tree-dump-times "s1.d = \{ 35871495301330685, 2005711373062887255 \};" 1 "optimized" } } */
      15  /* { dg-final { scan-tree-dump-times "s1.e = \{ 128, 1729384589077512192 \};" 1 "optimized" } } */
      16  /* { dg-final { scan-tree-dump-times "s1.f = \{ 655836773112359254, 2005509209063424011 \};" 1 "optimized" } } */
      17  /* { dg-final { scan-tree-dump-times "s1.g = \{ -157301717633283, -300131636150806697 \};" 1 "optimized" } } */
      18  /* { dg-final { scan-tree-dump-times "s1.h = \{ -128, -576458420136181760 \};" 1 "optimized" } } */
      19  /* { dg-final { scan-tree-dump-times "s1.i = \{ 655836777273157974, -300052325173559301 \};" 1 "optimized" } } */
      20  
      21  void
      22  foo (void)
      23  {
      24    __m128i a = _mm_set_epi64x (0xdeadbeefcafebabeULL, 0xfee1deadfeedfaceULL);
      25    __m128i b = _mm_set_epi64x (3, 9);
      26    __m128i c = _mm_set_epi32 (0xc00010ffU, 0x12345678U, 0xfedcba98U, 0x80000001U);
      27    __m128i d = _mm_set_epi32 (3, 32, -6, 24);
      28    __m128i e = _mm_set_epi16 (0xdead, 0xbeef, 0xcafe, 0xbabe,
      29  			     0x1234, 0x0012, 0x8001, 0xa55a);
      30    __m128i f = _mm_set_epi16 (3, 16, -1, 12, 1, 0, 5, 2);
      31    s1.a = _mm_sllv_epi64 (a, b);
      32    s1.b = _mm_sllv_epi32 (c, d);
      33    s1.c = _mm_sllv_epi16 (e, f);
      34    s1.d = _mm_srlv_epi64 (a, b);
      35    s1.e = _mm_srlv_epi32 (c, d);
      36    s1.f = _mm_srlv_epi16 (e, f);
      37    s1.g = _mm_srav_epi64 (a, b);
      38    s1.h = _mm_srav_epi32 (c, d);
      39    s1.i = _mm_srav_epi16 (e, f);
      40  }
      41  
      42  /* { dg-final { scan-tree-dump-times "s2.a = \{ 6722813395751927808, 0, 0, -1523361279884153888 \};" 1 "optimized" } } */
      43  /* { dg-final { scan-tree-dump-times "s2.b = \{ 9177596069264525312, 1851607040, -81985531201716224, 76543602090093808 \};" 1 "optimized" } } */
      44  /* { dg-final { scan-tree-dump-times "s2.c = \{ 1008895103428722688, -5985166321598332416, 2623346860254860648, -763360136839241728 \};" 1 "optimized" } } */
      45  /* { dg-final { scan-tree-dump-times "s2.d = \{ 2189249818860, 0, 0, 1002855686531443627 \};" 1 "optimized" } } */
      46  /* { dg-final { scan-tree-dump-times "s2.e = \{ 114276044520956448, 130489, -81985531201716224, 3377704168205116 \};" 1 "optimized" } } */
      47  /* { dg-final { scan-tree-dump-times "s2.f = \{ 289076540546023424, 3115407575762206978, 655836773112359254, 2005509209063424011 \};" 1 "optimized" } } */
      48  /* { dg-final { scan-tree-dump-times "s2.g = \{ 2189249818860, 0, -1, -150065818075403349 \};" 1 "optimized" } } */
      49  /* { dg-final { scan-tree-dump-times "s2.h = \{ -29839143554899424, -4294836807, -81985526906748929, -1125895459165380 \};" 1 "optimized" } } */
      50  /* { dg-final { scan-tree-dump-times "s2.i = \{ -287384211757400064, 3115618685752836354, 655836777273157974, -300052325173559301 \};" 1 "optimized" } } */
      51  
      52  void
      53  bar (void)
      54  {
      55    __m256i a = _mm256_set_epi64x (0xdeadbeefcafebabeULL, 0xfee1deadfeedfaceULL,
      56  				 0x123456789abcdef0ULL, 0x0fedcba987654321ULL);
      57    __m256i b = _mm256_set_epi64x (4, 65, -2, 19);
      58    __m256i c = _mm256_set_epi32 (0xc00010ffU, 0x12345678U, 0xfedcba98U, 0x80000001U,
      59  				0xdeadbeefU, 0x0fedcba9U, 0xcafebabeU, 0x00111100U);
      60    __m256i d = _mm256_set_epi32 (12, 1, 0, -2, 32, 11, 7, 3);
      61    __m256i e = _mm256_set_epi16 (0xdead, 0xbeef, 0xcafe, 0xbabe,
      62  				0x1234, 0x0012, 0x8001, 0xa55a,
      63  				0x5678, 0x9abc, 0xdef0, 0x1020,
      64  				0x8070, 0x6543, 0x129f, 0);
      65    __m256i f = _mm256_set_epi16 (3, 16, -1, 12, 1, 0, 5, 2, 1, 2, 3, 4, 5, 6, 7, 8);
      66    s2.a = _mm256_sllv_epi64 (a, b);
      67    s2.b = _mm256_sllv_epi32 (c, d);
      68    s2.c = _mm256_sllv_epi16 (e, f);
      69    s2.d = _mm256_srlv_epi64 (a, b);
      70    s2.e = _mm256_srlv_epi32 (c, d);
      71    s2.f = _mm256_srlv_epi16 (e, f);
      72    s2.g = _mm256_srav_epi64 (a, b);
      73    s2.h = _mm256_srav_epi32 (c, d);
      74    s2.i = _mm256_srav_epi16 (e, f);
      75  }
      76  
      77  /* { dg-final { scan-tree-dump-times "s3.a = \{ 6592671264835730432, 5247073869855161280, 1147797409030816545, -161076958856481380, 6722813395751927808, 0, 0, -1523361279884153888 \};" 1 "optimized" } } */
      78  /* { dg-final { scan-tree-dump-times "s3.b = \{ -4611667331015735296, 6592669523180452796, 2541551364173987968, 1068969636, 9177596069264525312, 1851607040, -81985531201716224, 76543602090093808 \};" 1 "optimized" } } */
      79  /* { dg-final { scan-tree-dump-times "s3.c = \{ 6233191819462621886, 8070591269736295416, 8610979175836155904, 40534596407293308, 1008895103428722688, -5985166321598332416, 2623346860254860648, -763360136839241728 \};" 1 "optimized" } } */
      80  /* { dg-final { scan-tree-dump-times "s3.d = \{ 31339240204107613, 327942116865947580, 1147797409030816545, 9183102797140655463, 2189249818860, 0, 0, 1002855686531443627 \};" 1 "optimized" } } */
      81  /* { dg-final { scan-tree-dump-times "s3.e = \{ -4611667331024543200, 31339239126560699, 81985526923526144, 66810602, 114276044520956448, 130489, -81985531201716224, 3377704168205116 \};" 1 "optimized" } } */
      82  /* { dg-final { scan-tree-dump-times "s3.f = \{ 125466298768407230, 36028797018976959, 107269861939347456, 563225682730335, 289076540546023424, 3115407575762206978, 655836773112359254, 2005509209063424011 \};" 1 "optimized" } } */
      83  /* { dg-final { scan-tree-dump-times "s3.g = \{ -4689556814856355, 327942116865947580, 1147797409030816545, -40269239714120345, 2189249818860, 0, -1, -150065818075403349 \};" 1 "optimized" } } */
      84  /* { dg-final { scan-tree-dump-times "s3.h = \{ -4611667331024543200, -4689554671177797, 81985531184939008, 66810602, -29839143554899424, -4294836807, -81985526906748929, -1125895459165380 \};" 1 "optimized" } } */
      85  /* { dg-final { scan-tree-dump-times "s3.i = \{ -18648885549352258, -36028797018901825, -36599031236919297, 844154124885343, -287384211757400064, 3115618685752836354, 655836777273157974, -300052325173559301 \};" 1 "optimized" } } */
      86  
      87  void
      88  baz (void)
      89  {
      90    __m512i a = _mm512_set_epi64 (0xdeadbeefcafebabeULL, 0xfee1deadfeedfaceULL,
      91  				0x123456789abcdef0ULL, 0x0fedcba987654321ULL,
      92  				0xfee1deadfeedfaceULL, 0x0fedcba987654321ULL,
      93  				0x123456789abcdef0ULL, 0xdeadbeefcafebabeULL);
      94    __m512i b = _mm512_set_epi64 (4, 65, -2, 19, 1, 0, 2, 9);
      95    __m512i c = _mm512_set_epi32 (0xc00010ffU, 0x12345678U, 0xfedcba98U, 0x80000001U,
      96  				0xdeadbeefU, 0x0fedcba9U, 0xcafebabeU, 0x00111100U,
      97  				0, 0x0fedcba9U, 0x12345678U, 0x80000001U,
      98  				0xdeadbeefU, 0xdeadbeefU, 0xc00010ffU, 0x00111100U);
      99    __m512i d = _mm512_set_epi32 (12, 1, 0, -2, 32, 11, 7, 3, 1, 2, 4, 7, 9, 2, 0, 3);
     100    __m512i e = _mm512_set_epi16 (0xdead, 0xbeef, 0xcafe, 0xbabe,
     101  				0x1234, 0x0012, 0x8001, 0xa55a,
     102  				0x5678, 0x9abc, 0xdef0, 0x1020,
     103  				0x8070, 0x6543, 0x129f, 0,
     104  				0x0012, 0x8001, 0xcafe, 0xbabe,
     105  				0xbeef, 0xcafe, 0x9abc, 0xdef0,
     106  				0x8070, 0x6543, 0x129f, 0xcafe,
     107  				0xdead, 0xbeef, 0xcafe, 0xbabe);
     108    __m512i f = _mm512_set_epi16 (3, 16, -1, 12, 1, 0, 5, 2, 1, 2, 3, 4, 5, 6, 7, 8,
     109  				3, 9, 2, 1, 7, 3, -12, 26, 8, 15, 17, 2, 7, 0, 3, 0);
     110    s3.a = _mm512_sllv_epi64 (a, b);
     111    s3.b = _mm512_sllv_epi32 (c, d);
     112    s3.c = _mm512_sllv_epi16 (e, f);
     113    s3.d = _mm512_srlv_epi64 (a, b);
     114    s3.e = _mm512_srlv_epi32 (c, d);
     115    s3.f = _mm512_srlv_epi16 (e, f);
     116    s3.g = _mm512_srav_epi64 (a, b);
     117    s3.h = _mm512_srav_epi32 (c, d);
     118    s3.i = _mm512_srav_epi16 (e, f);
     119  }