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
calc_pext_u64(unsigned long long a,unsigned long long mask)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
bmi2_test()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 }
44