1 /* { dg-do run { target { bmi2 && { ! ia32 } } } } */ 2 /* { dg-options "-mbmi2 -O2" } */ 3 4 #include <x86intrin.h> 5 #include "bmi2-check.h" 6 7 __attribute__((noinline)) 8 unsigned long long calc_pdep_u64(unsigned long long a,unsigned long long mask)9calc_pdep_u64 (unsigned long long a, unsigned long long mask) 10 { 11 unsigned long long res = 0; 12 unsigned long long i, k = 0; 13 14 for (i = 0; i < 64; ++i) 15 if (mask & (1LL << i)) { 16 res |= ((a & (1LL << k)) >> k) << i; 17 ++k; 18 } 19 return res; 20 } 21 22 static void bmi2_test()23bmi2_test () 24 { 25 unsigned long long i; 26 unsigned long long src = 0xce7acce7acce7ac; 27 unsigned long long res, res_ref; 28 29 for (i = 0; i < 5; ++i) { 30 src = src * (i + 1); 31 32 res_ref = calc_pdep_u64 (src, ~(i * 3)); 33 res = _pdep_u64 (src, ~(i * 3)); 34 35 if (res != res_ref) 36 abort(); 37 } 38 } 39