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