(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512f-vpcompressb-2.c
       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  #include <stdio.h>
       8  #define AVX512VBMI2
       9  #include "avx512f-helper.h"
      10  
      11  #define SIZE (AVX512F_LEN / 8)
      12  #include "avx512f-mask-type.h"
      13  #include <x86intrin.h>
      14  
      15  static void
      16  CALC (char *s, char *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_b) s, res1, res2;
      31    char res3[SIZE];
      32    MASK_TYPE compressed_mask, mask = MASK_VALUE;
      33    char res_ref[SIZE];
      34    long long 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_epi8) (res1.x, mask, s.x);
      45    res2.x = INTRINSIC (_maskz_compress_epi8) (mask, s.x);
      46    INTRINSIC (_mask_compressstoreu_epi8) (res3, mask, s.x);
      47  
      48    // Swt
      49    if (AVX512F_LEN == 512)
      50      mask_bit_count = _popcnt32((int)(mask & (((long long)1 << 32) - 1)))
      51  		     + _popcnt32((int)((long long)mask >> 32));
      52    else
      53      mask_bit_count = __popcntd(mask);
      54    compressed_mask = ((long long)1 << mask_bit_count) - 1;
      55    CALC (s.a, res_ref, mask);
      56  
      57    MASK_MERGE (i_b) (res_ref, compressed_mask, SIZE);
      58    if (UNION_CHECK (AVX512F_LEN, i_b) (res1, res_ref))
      59      abort ();
      60  
      61    MASK_ZERO (i_b) (res_ref, compressed_mask, SIZE);
      62    if (UNION_CHECK (AVX512F_LEN, i_b) (res2, res_ref))
      63      abort ();
      64  
      65    MASK_MERGE (i_b) (res_ref, compressed_mask, SIZE);
      66    if (checkVc (res3, res_ref, SIZE))
      67      abort ();
      68  }