1*1208bc7eSAndroid Build Coastguard Worker #ifndef strings_h 2*1208bc7eSAndroid Build Coastguard Worker #define strings_h 3*1208bc7eSAndroid Build Coastguard Worker 4*1208bc7eSAndroid Build Coastguard Worker /* MSVC doesn't define ffs/ffsl. This dummy strings.h header is provided 5*1208bc7eSAndroid Build Coastguard Worker * for both */ 6*1208bc7eSAndroid Build Coastguard Worker #ifdef _MSC_VER 7*1208bc7eSAndroid Build Coastguard Worker # include <intrin.h> 8*1208bc7eSAndroid Build Coastguard Worker # pragma intrinsic(_BitScanForward) ffsl(long x)9*1208bc7eSAndroid Build Coastguard Workerstatic __forceinline int ffsl(long x) { 10*1208bc7eSAndroid Build Coastguard Worker unsigned long i; 11*1208bc7eSAndroid Build Coastguard Worker 12*1208bc7eSAndroid Build Coastguard Worker if (_BitScanForward(&i, x)) { 13*1208bc7eSAndroid Build Coastguard Worker return i + 1; 14*1208bc7eSAndroid Build Coastguard Worker } 15*1208bc7eSAndroid Build Coastguard Worker return 0; 16*1208bc7eSAndroid Build Coastguard Worker } 17*1208bc7eSAndroid Build Coastguard Worker ffs(int x)18*1208bc7eSAndroid Build Coastguard Workerstatic __forceinline int ffs(int x) { 19*1208bc7eSAndroid Build Coastguard Worker return ffsl(x); 20*1208bc7eSAndroid Build Coastguard Worker } 21*1208bc7eSAndroid Build Coastguard Worker 22*1208bc7eSAndroid Build Coastguard Worker # ifdef _M_X64 23*1208bc7eSAndroid Build Coastguard Worker # pragma intrinsic(_BitScanForward64) 24*1208bc7eSAndroid Build Coastguard Worker # endif 25*1208bc7eSAndroid Build Coastguard Worker ffsll(unsigned __int64 x)26*1208bc7eSAndroid Build Coastguard Workerstatic __forceinline int ffsll(unsigned __int64 x) { 27*1208bc7eSAndroid Build Coastguard Worker unsigned long i; 28*1208bc7eSAndroid Build Coastguard Worker #ifdef _M_X64 29*1208bc7eSAndroid Build Coastguard Worker if (_BitScanForward64(&i, x)) { 30*1208bc7eSAndroid Build Coastguard Worker return i + 1; 31*1208bc7eSAndroid Build Coastguard Worker } 32*1208bc7eSAndroid Build Coastguard Worker return 0; 33*1208bc7eSAndroid Build Coastguard Worker #else 34*1208bc7eSAndroid Build Coastguard Worker // Fallback for 32-bit build where 64-bit version not available 35*1208bc7eSAndroid Build Coastguard Worker // assuming little endian 36*1208bc7eSAndroid Build Coastguard Worker union { 37*1208bc7eSAndroid Build Coastguard Worker unsigned __int64 ll; 38*1208bc7eSAndroid Build Coastguard Worker unsigned long l[2]; 39*1208bc7eSAndroid Build Coastguard Worker } s; 40*1208bc7eSAndroid Build Coastguard Worker 41*1208bc7eSAndroid Build Coastguard Worker s.ll = x; 42*1208bc7eSAndroid Build Coastguard Worker 43*1208bc7eSAndroid Build Coastguard Worker if (_BitScanForward(&i, s.l[0])) { 44*1208bc7eSAndroid Build Coastguard Worker return i + 1; 45*1208bc7eSAndroid Build Coastguard Worker } else if(_BitScanForward(&i, s.l[1])) { 46*1208bc7eSAndroid Build Coastguard Worker return i + 33; 47*1208bc7eSAndroid Build Coastguard Worker } 48*1208bc7eSAndroid Build Coastguard Worker return 0; 49*1208bc7eSAndroid Build Coastguard Worker #endif 50*1208bc7eSAndroid Build Coastguard Worker } 51*1208bc7eSAndroid Build Coastguard Worker 52*1208bc7eSAndroid Build Coastguard Worker #else 53*1208bc7eSAndroid Build Coastguard Worker # define ffsll(x) __builtin_ffsll(x) 54*1208bc7eSAndroid Build Coastguard Worker # define ffsl(x) __builtin_ffsl(x) 55*1208bc7eSAndroid Build Coastguard Worker # define ffs(x) __builtin_ffs(x) 56*1208bc7eSAndroid Build Coastguard Worker #endif 57*1208bc7eSAndroid Build Coastguard Worker 58*1208bc7eSAndroid Build Coastguard Worker #endif /* strings_h */ 59