1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx512f -mavx512bw -mavx512vbmi2" } */
       3  /* { dg-require-effective-target avx512f } */
       4  /* { dg-require-effective-target avx512vbmi2 } */
       5  
       6  #define AVX512F
       7  
       8  #define AVX512VBMI2
       9  #include "avx512f-helper.h"
      10  
      11  #define SIZE (AVX512F_LEN / 16)
      12  #include "avx512f-mask-type.h"
      13  #include <x86intrin.h>
      14  
      15  static void
      16  CALC (short *s, short *r, MASK_TYPE mask)
      17  {
      18    int i, k;
      19  
      20    for (i = 0, k = 0; i < SIZE; i++)
      21      {
      22        if (mask & ((long long)1 << i))
      23  	r[k++] = s[i];
      24      }
      25  }
      26  
      27  void
      28  TEST (void)
      29  {
      30    UNION_TYPE (AVX512F_LEN, i_w) s, res1, res2;
      31    short res3[SIZE];
      32    MASK_TYPE compressed_mask, mask = MASK_VALUE;
      33    short res_ref[SIZE];
      34    int i, mask_bit_count, sign = 1;
      35  
      36    for (i = 0; i < SIZE; i++)
      37      {
      38        s.a[i] = 12345 * (i + 200) * sign;
      39        res1.a[i] = DEFAULT_VALUE;
      40        res3[i] = DEFAULT_VALUE;
      41        sign = -sign;
      42      }
      43  
      44    res1.x = INTRINSIC (_mask_compress_epi16) (res1.x, mask, s.x);
      45    res2.x = INTRINSIC (_maskz_compress_epi16) (mask, s.x);
      46    INTRINSIC (_mask_compressstoreu_epi16) (res3, mask, s.x);
      47  
      48    mask_bit_count = __popcntd (mask);
      49    compressed_mask = ((long long)1 << mask_bit_count) - 1;
      50    CALC (s.a, res_ref, mask);
      51  
      52    MASK_MERGE (i_w) (res_ref, compressed_mask, SIZE);
      53  
      54    if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
      55      abort ();
      56  
      57    MASK_ZERO (i_w) (res_ref, compressed_mask, SIZE);
      58    if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
      59      abort ();
      60  
      61    MASK_MERGE (i_w) (res_ref, compressed_mask, SIZE);
      62    if (checkVs (res3, res_ref, SIZE))
      63      abort ();
      64  }