1  /* { dg-do run } */
       2  /* { dg-options "-O3 -mdejagnu-cpu=power7" } */
       3  /* { dg-require-effective-target lp64 } */
       4  /* { dg-require-effective-target vsx_hw } */
       5  /* { dg-require-effective-target ppc_cpu_supports_hw } */
       6  
       7  #define NO_WARN_X86_INTRINSICS 1
       8  #include <x86intrin.h>
       9  #include "bmi2-check.h"
      10  
      11  __attribute__((noinline))
      12  unsigned long long
      13  calc_pext_u64 (unsigned long long a, unsigned long long mask)
      14  {
      15    unsigned long long res = 0;
      16    int i, k = 0;
      17  
      18    for (i = 0; i < 64; ++i)
      19      if (mask & (1LL << i)) {
      20        res |= ((a & (1LL << i)) >> i) << k;
      21        ++k;
      22      }
      23  
      24    return res;
      25  }
      26  
      27  static void
      28  bmi2_test ()
      29  {
      30    unsigned long long i;
      31    unsigned long long src = 0xce7acce7acce7ac;
      32    unsigned long long res, res_ref;
      33  
      34    for (i = 0; i < 5; ++i) {
      35      src = src * (i + 1);
      36  
      37      res_ref = calc_pext_u64 (src, ~(i * 3));
      38      res = _pext_u64 (src, ~(i * 3));
      39  
      40      if (res != res_ref)
      41        abort();
      42    }
      43  }