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)13calc_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()28bmi2_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