xref: /aosp_15_r20/external/jemalloc_new/include/msvc_compat/strings.h (revision 1208bc7e437ced7eb82efac44ba17e3beba411da)
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 Worker static __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 Worker static __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 Worker static __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