1  /* PR target/101472 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-mavx512f -O2" } */
       4  /* { dg-final { scan-assembler-times "vpscatterqd\[ \\t\]+\[^\{\n\]*ymm\[0-9\]\[^\n\]*zmm\[0-9\]\[^\n\]*{%k\[1-7\]}(?:\n|\[ \\t\]+#)" 2 } } */
       5  /* { dg-final { scan-assembler-times "vpscatterdd\[ \\t\]+\[^\{\n\]*zmm\[0-9\]\[^\n\]*zmm\[0-9\]\[^\n\]*{%k\[1-7\]}(?:\n|\[ \\t\]+#)" 2 } } */
       6  /* { dg-final { scan-assembler-times "vpscatterqq\[ \\t\]+\[^\{\n\]*zmm\[0-9\]\[^\n\]*zmm\[0-9\]\[^\n\]*{%k\[1-7\]}(?:\n|\[ \\t\]+#)" 2 } } */
       7  /* { dg-final { scan-assembler-times "vpscatterdq\[ \\t\]+\[^\{\n\]*zmm\[0-9\]\[^\n\]*ymm\[0-9\]\[^\n\]*{%k\[1-7\]}(?:\n|\[ \\t\]+#)" 2 } } */
       8  /* { dg-final { scan-assembler-times "vscatterqps\[ \\t\]+\[^\{\n\]*ymm\[0-9\]\[^\n\]*zmm\[0-9\]\[^\n\]*{%k\[1-7\]}(?:\n|\[ \\t\]+#)" 2 } } */
       9  /* { dg-final { scan-assembler-times "vscatterdps\[ \\t\]+\[^\{\n\]*zmm\[0-9\]\[^\n\]*zmm\[0-9\]\[^\n\]*{%k\[1-7\]}(?:\n|\[ \\t\]+#)" 2 } } */
      10  /* { dg-final { scan-assembler-times "vscatterqpd\[ \\t\]+\[^\{\n\]*zmm\[0-9\]\[^\n\]*zmm\[0-9\]\[^\n\]*{%k\[1-7\]}(?:\n|\[ \\t\]+#)" 2 } } */
      11  /* { dg-final { scan-assembler-times "vscatterdpd\[ \\t\]+\[^\{\n\]*zmm\[0-9\]\[^\n\]*ymm\[0-9\]\[^\n\]*{%k\[1-7\]}(?:\n|\[ \\t\]+#)" 2 } } */
      12  
      13  #include <immintrin.h>
      14  
      15  void two_scatters_epi32(void* addr, __mmask8 k1, __mmask8 k2, __m512i vindex, 
      16  			 __m256i a, __m512i b)
      17  {
      18      _mm512_mask_i64scatter_epi32(addr, k1, vindex, a, 1);
      19      _mm512_mask_i64scatter_epi32(addr, k2, vindex, a, 1);
      20      _mm512_mask_i32scatter_epi32(addr, k1, vindex, b, 1);
      21      _mm512_mask_i32scatter_epi32(addr, k2, vindex, b, 1);
      22  }
      23  
      24  void two_scatters_epi64(void* addr, __mmask8 k1, __mmask8 k2, __m512i vindex, 
      25  			 __m256i idx, __m512i a)
      26  {
      27      _mm512_mask_i64scatter_epi64(addr, k1, vindex, a, 1);
      28      _mm512_mask_i64scatter_epi64(addr, k2, vindex, a, 1);
      29      _mm512_mask_i32scatter_epi64(addr, k1, idx, a, 1);
      30      _mm512_mask_i32scatter_epi64(addr, k2, idx, a, 1);
      31  }
      32  
      33  void two_scatters_ps(void* addr, __mmask8 k1, __mmask8 k2, __m512i vindex, 
      34  		      __m256 a, __m512 b)
      35  {
      36      _mm512_mask_i64scatter_ps(addr, k1, vindex, a, 1);
      37      _mm512_mask_i64scatter_ps(addr, k2, vindex, a, 1);
      38      _mm512_mask_i32scatter_ps(addr, k1, vindex, b, 1);
      39      _mm512_mask_i32scatter_ps(addr, k2, vindex, b, 1);
      40  }
      41  
      42  void two_scatters_pd(void* addr, __mmask8 k1, __mmask8 k2, __m512i vindex, 
      43  		      __m256i idx, __m512d a)
      44  {
      45      _mm512_mask_i64scatter_pd(addr, k1, vindex, a, 1);
      46      _mm512_mask_i64scatter_pd(addr, k2, vindex, a, 1);
      47      _mm512_mask_i32scatter_pd(addr, k1, idx, a, 1);
      48      _mm512_mask_i32scatter_pd(addr, k2, idx, a, 1);
      49  }