xref: /aosp_15_r20/external/erofs-utils/include/erofs/defs.h (revision 33b1fccf6a0fada2c2875d400ed01119b7676ee5)
1*33b1fccfSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0 */
2*33b1fccfSAndroid Build Coastguard Worker /*
3*33b1fccfSAndroid Build Coastguard Worker  * Copyright (C) 2018 HUAWEI, Inc.
4*33b1fccfSAndroid Build Coastguard Worker  *             http://www.huawei.com/
5*33b1fccfSAndroid Build Coastguard Worker  * Created by Li Guifu <[email protected]>
6*33b1fccfSAndroid Build Coastguard Worker  * Modified by Gao Xiang <[email protected]>
7*33b1fccfSAndroid Build Coastguard Worker  */
8*33b1fccfSAndroid Build Coastguard Worker #ifndef __EROFS_DEFS_H
9*33b1fccfSAndroid Build Coastguard Worker #define __EROFS_DEFS_H
10*33b1fccfSAndroid Build Coastguard Worker 
11*33b1fccfSAndroid Build Coastguard Worker #ifdef __cplusplus
12*33b1fccfSAndroid Build Coastguard Worker extern "C"
13*33b1fccfSAndroid Build Coastguard Worker {
14*33b1fccfSAndroid Build Coastguard Worker #endif
15*33b1fccfSAndroid Build Coastguard Worker 
16*33b1fccfSAndroid Build Coastguard Worker #include <stddef.h>
17*33b1fccfSAndroid Build Coastguard Worker #include <stdint.h>
18*33b1fccfSAndroid Build Coastguard Worker #include <assert.h>
19*33b1fccfSAndroid Build Coastguard Worker #include <inttypes.h>
20*33b1fccfSAndroid Build Coastguard Worker #include <limits.h>
21*33b1fccfSAndroid Build Coastguard Worker #include <stdbool.h>
22*33b1fccfSAndroid Build Coastguard Worker 
23*33b1fccfSAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
24*33b1fccfSAndroid Build Coastguard Worker #include <config.h>
25*33b1fccfSAndroid Build Coastguard Worker #endif
26*33b1fccfSAndroid Build Coastguard Worker 
27*33b1fccfSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_TYPES_H
28*33b1fccfSAndroid Build Coastguard Worker #include <linux/types.h>
29*33b1fccfSAndroid Build Coastguard Worker #endif
30*33b1fccfSAndroid Build Coastguard Worker 
31*33b1fccfSAndroid Build Coastguard Worker /*
32*33b1fccfSAndroid Build Coastguard Worker  * container_of - cast a member of a structure out to the containing structure
33*33b1fccfSAndroid Build Coastguard Worker  * @ptr:	the pointer to the member.
34*33b1fccfSAndroid Build Coastguard Worker  * @type:	the type of the container struct this is embedded in.
35*33b1fccfSAndroid Build Coastguard Worker  * @member:	the name of the member within the struct.
36*33b1fccfSAndroid Build Coastguard Worker  */
37*33b1fccfSAndroid Build Coastguard Worker #define container_of(ptr, type, member) ({			\
38*33b1fccfSAndroid Build Coastguard Worker 	const typeof(((type *)0)->member) *__mptr = (ptr);	\
39*33b1fccfSAndroid Build Coastguard Worker 	(type *)((char *)__mptr - offsetof(type, member)); })
40*33b1fccfSAndroid Build Coastguard Worker 
41*33b1fccfSAndroid Build Coastguard Worker typedef uint8_t         u8;
42*33b1fccfSAndroid Build Coastguard Worker typedef uint16_t        u16;
43*33b1fccfSAndroid Build Coastguard Worker typedef uint32_t        u32;
44*33b1fccfSAndroid Build Coastguard Worker typedef uint64_t        u64;
45*33b1fccfSAndroid Build Coastguard Worker 
46*33b1fccfSAndroid Build Coastguard Worker #ifndef HAVE_LINUX_TYPES_H
47*33b1fccfSAndroid Build Coastguard Worker typedef u8	__u8;
48*33b1fccfSAndroid Build Coastguard Worker typedef u16	__u16;
49*33b1fccfSAndroid Build Coastguard Worker typedef u32	__u32;
50*33b1fccfSAndroid Build Coastguard Worker typedef u64	__u64;
51*33b1fccfSAndroid Build Coastguard Worker typedef u16	__le16;
52*33b1fccfSAndroid Build Coastguard Worker typedef u32	__le32;
53*33b1fccfSAndroid Build Coastguard Worker typedef u64	__le64;
54*33b1fccfSAndroid Build Coastguard Worker typedef u16	__be16;
55*33b1fccfSAndroid Build Coastguard Worker typedef u32	__be32;
56*33b1fccfSAndroid Build Coastguard Worker typedef u64	__be64;
57*33b1fccfSAndroid Build Coastguard Worker #endif
58*33b1fccfSAndroid Build Coastguard Worker 
59*33b1fccfSAndroid Build Coastguard Worker typedef int8_t          s8;
60*33b1fccfSAndroid Build Coastguard Worker typedef int16_t         s16;
61*33b1fccfSAndroid Build Coastguard Worker typedef int32_t         s32;
62*33b1fccfSAndroid Build Coastguard Worker typedef int64_t         s64;
63*33b1fccfSAndroid Build Coastguard Worker 
64*33b1fccfSAndroid Build Coastguard Worker #if __BYTE_ORDER == __LITTLE_ENDIAN
65*33b1fccfSAndroid Build Coastguard Worker /*
66*33b1fccfSAndroid Build Coastguard Worker  * The host byte order is the same as network byte order,
67*33b1fccfSAndroid Build Coastguard Worker  * so these functions are all just identity.
68*33b1fccfSAndroid Build Coastguard Worker  */
69*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le16(x) ((__u16)(x))
70*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le32(x) ((__u32)(x))
71*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le64(x) ((__u64)(x))
72*33b1fccfSAndroid Build Coastguard Worker #define le16_to_cpu(x) ((__u16)(x))
73*33b1fccfSAndroid Build Coastguard Worker #define le32_to_cpu(x) ((__u32)(x))
74*33b1fccfSAndroid Build Coastguard Worker #define le64_to_cpu(x) ((__u64)(x))
75*33b1fccfSAndroid Build Coastguard Worker 
76*33b1fccfSAndroid Build Coastguard Worker #else
77*33b1fccfSAndroid Build Coastguard Worker #if __BYTE_ORDER == __BIG_ENDIAN
78*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le16(x) (__builtin_bswap16(x))
79*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le32(x) (__builtin_bswap32(x))
80*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le64(x) (__builtin_bswap64(x))
81*33b1fccfSAndroid Build Coastguard Worker #define le16_to_cpu(x) (__builtin_bswap16(x))
82*33b1fccfSAndroid Build Coastguard Worker #define le32_to_cpu(x) (__builtin_bswap32(x))
83*33b1fccfSAndroid Build Coastguard Worker #define le64_to_cpu(x) (__builtin_bswap64(x))
84*33b1fccfSAndroid Build Coastguard Worker #else
85*33b1fccfSAndroid Build Coastguard Worker #pragma error
86*33b1fccfSAndroid Build Coastguard Worker #endif
87*33b1fccfSAndroid Build Coastguard Worker #endif
88*33b1fccfSAndroid Build Coastguard Worker 
89*33b1fccfSAndroid Build Coastguard Worker #ifdef __cplusplus
90*33b1fccfSAndroid Build Coastguard Worker #define BUILD_BUG_ON(condition) static_assert(!(condition))
91*33b1fccfSAndroid Build Coastguard Worker #elif !defined(__OPTIMIZE__)
92*33b1fccfSAndroid Build Coastguard Worker #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2 * !!(condition)]))
93*33b1fccfSAndroid Build Coastguard Worker #else
94*33b1fccfSAndroid Build Coastguard Worker #define BUILD_BUG_ON(condition) assert(!(condition))
95*33b1fccfSAndroid Build Coastguard Worker #endif
96*33b1fccfSAndroid Build Coastguard Worker 
97*33b1fccfSAndroid Build Coastguard Worker #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
98*33b1fccfSAndroid Build Coastguard Worker 
99*33b1fccfSAndroid Build Coastguard Worker #define __round_mask(x, y)      ((__typeof__(x))((y)-1))
100*33b1fccfSAndroid Build Coastguard Worker #define round_up(x, y)          ((((x)-1) | __round_mask(x, y))+1)
101*33b1fccfSAndroid Build Coastguard Worker #define round_down(x, y)        ((x) & ~__round_mask(x, y))
102*33b1fccfSAndroid Build Coastguard Worker 
103*33b1fccfSAndroid Build Coastguard Worker #ifndef roundup
104*33b1fccfSAndroid Build Coastguard Worker /* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */
105*33b1fccfSAndroid Build Coastguard Worker #define roundup(x, y) (					\
106*33b1fccfSAndroid Build Coastguard Worker {							\
107*33b1fccfSAndroid Build Coastguard Worker 	const typeof(y) __y = y;			\
108*33b1fccfSAndroid Build Coastguard Worker 	(((x) + (__y - 1)) / __y) * __y;		\
109*33b1fccfSAndroid Build Coastguard Worker }							\
110*33b1fccfSAndroid Build Coastguard Worker )
111*33b1fccfSAndroid Build Coastguard Worker #endif
112*33b1fccfSAndroid Build Coastguard Worker #define rounddown(x, y) (				\
113*33b1fccfSAndroid Build Coastguard Worker {							\
114*33b1fccfSAndroid Build Coastguard Worker 	typeof(x) __x = (x);				\
115*33b1fccfSAndroid Build Coastguard Worker 	__x - (__x % (y));				\
116*33b1fccfSAndroid Build Coastguard Worker }							\
117*33b1fccfSAndroid Build Coastguard Worker )
118*33b1fccfSAndroid Build Coastguard Worker 
119*33b1fccfSAndroid Build Coastguard Worker /* Can easily conflict with C++'s std::min */
120*33b1fccfSAndroid Build Coastguard Worker #ifndef __cplusplus
121*33b1fccfSAndroid Build Coastguard Worker #define min(x, y) ({				\
122*33b1fccfSAndroid Build Coastguard Worker 	typeof(x) _min1 = (x);			\
123*33b1fccfSAndroid Build Coastguard Worker 	typeof(y) _min2 = (y);			\
124*33b1fccfSAndroid Build Coastguard Worker 	(void) (&_min1 == &_min2);		\
125*33b1fccfSAndroid Build Coastguard Worker 	_min1 < _min2 ? _min1 : _min2; })
126*33b1fccfSAndroid Build Coastguard Worker 
127*33b1fccfSAndroid Build Coastguard Worker #define max(x, y) ({				\
128*33b1fccfSAndroid Build Coastguard Worker 	typeof(x) _max1 = (x);			\
129*33b1fccfSAndroid Build Coastguard Worker 	typeof(y) _max2 = (y);			\
130*33b1fccfSAndroid Build Coastguard Worker 	(void) (&_max1 == &_max2);		\
131*33b1fccfSAndroid Build Coastguard Worker 	_max1 > _max2 ? _max1 : _max2; })
132*33b1fccfSAndroid Build Coastguard Worker #endif
133*33b1fccfSAndroid Build Coastguard Worker 
134*33b1fccfSAndroid Build Coastguard Worker /*
135*33b1fccfSAndroid Build Coastguard Worker  * ..and if you can't take the strict types, you can specify one yourself.
136*33b1fccfSAndroid Build Coastguard Worker  * Or don't use min/max at all, of course.
137*33b1fccfSAndroid Build Coastguard Worker  */
138*33b1fccfSAndroid Build Coastguard Worker #define min_t(type, x, y) ({			\
139*33b1fccfSAndroid Build Coastguard Worker 	type __min1 = (x);			\
140*33b1fccfSAndroid Build Coastguard Worker 	type __min2 = (y);			\
141*33b1fccfSAndroid Build Coastguard Worker 	__min1 < __min2 ? __min1: __min2; })
142*33b1fccfSAndroid Build Coastguard Worker 
143*33b1fccfSAndroid Build Coastguard Worker #define max_t(type, x, y) ({			\
144*33b1fccfSAndroid Build Coastguard Worker 	type __max1 = (x);			\
145*33b1fccfSAndroid Build Coastguard Worker 	type __max2 = (y);			\
146*33b1fccfSAndroid Build Coastguard Worker 	__max1 > __max2 ? __max1: __max2; })
147*33b1fccfSAndroid Build Coastguard Worker 
148*33b1fccfSAndroid Build Coastguard Worker #define cmpsgn(x, y) ({		\
149*33b1fccfSAndroid Build Coastguard Worker 	typeof(x) _x = (x);	\
150*33b1fccfSAndroid Build Coastguard Worker 	typeof(y) _y = (y);	\
151*33b1fccfSAndroid Build Coastguard Worker 	(_x > _y) - (_x < _y); })
152*33b1fccfSAndroid Build Coastguard Worker 
153*33b1fccfSAndroid Build Coastguard Worker #define ARRAY_SIZE(arr)	(sizeof(arr) / sizeof((arr)[0]))
154*33b1fccfSAndroid Build Coastguard Worker 
155*33b1fccfSAndroid Build Coastguard Worker #define BIT(nr)             (1UL << (nr))
156*33b1fccfSAndroid Build Coastguard Worker #define BIT_ULL(nr)         (1ULL << (nr))
157*33b1fccfSAndroid Build Coastguard Worker #define BIT_MASK(nr)        (1UL << ((nr) % BITS_PER_LONG))
158*33b1fccfSAndroid Build Coastguard Worker #define BIT_WORD(nr)        ((nr) / BITS_PER_LONG)
159*33b1fccfSAndroid Build Coastguard Worker #define BIT_ULL_MASK(nr)    (1ULL << ((nr) % BITS_PER_LONG_LONG))
160*33b1fccfSAndroid Build Coastguard Worker #define BIT_ULL_WORD(nr)    ((nr) / BITS_PER_LONG_LONG)
161*33b1fccfSAndroid Build Coastguard Worker #define BITS_PER_BYTE       8
162*33b1fccfSAndroid Build Coastguard Worker #define BITS_TO_LONGS(nr)   DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
163*33b1fccfSAndroid Build Coastguard Worker 
164*33b1fccfSAndroid Build Coastguard Worker #ifdef __SIZEOF_LONG__
165*33b1fccfSAndroid Build Coastguard Worker #define BITS_PER_LONG (__CHAR_BIT__ * __SIZEOF_LONG__)
166*33b1fccfSAndroid Build Coastguard Worker #else
167*33b1fccfSAndroid Build Coastguard Worker #define BITS_PER_LONG __WORDSIZE
168*33b1fccfSAndroid Build Coastguard Worker #endif
169*33b1fccfSAndroid Build Coastguard Worker 
170*33b1fccfSAndroid Build Coastguard Worker #define BUG_ON(cond)        assert(!(cond))
171*33b1fccfSAndroid Build Coastguard Worker 
172*33b1fccfSAndroid Build Coastguard Worker #ifdef NDEBUG
173*33b1fccfSAndroid Build Coastguard Worker #define DBG_BUGON(condition)	((void)(condition))
174*33b1fccfSAndroid Build Coastguard Worker #else
175*33b1fccfSAndroid Build Coastguard Worker #define DBG_BUGON(condition)	BUG_ON(condition)
176*33b1fccfSAndroid Build Coastguard Worker #endif
177*33b1fccfSAndroid Build Coastguard Worker 
178*33b1fccfSAndroid Build Coastguard Worker #ifndef __maybe_unused
179*33b1fccfSAndroid Build Coastguard Worker #define __maybe_unused      __attribute__((__unused__))
180*33b1fccfSAndroid Build Coastguard Worker #endif
181*33b1fccfSAndroid Build Coastguard Worker 
182*33b1fccfSAndroid Build Coastguard Worker #define __packed __attribute__((__packed__))
183*33b1fccfSAndroid Build Coastguard Worker 
184*33b1fccfSAndroid Build Coastguard Worker #define __get_unaligned_t(type, ptr) ({						\
185*33b1fccfSAndroid Build Coastguard Worker 	const struct { type x; } __packed *__pptr = (typeof(__pptr))(ptr);	\
186*33b1fccfSAndroid Build Coastguard Worker 	__pptr->x;								\
187*33b1fccfSAndroid Build Coastguard Worker })
188*33b1fccfSAndroid Build Coastguard Worker 
189*33b1fccfSAndroid Build Coastguard Worker #define __put_unaligned_t(type, val, ptr) do {					\
190*33b1fccfSAndroid Build Coastguard Worker 	struct { type x; } __packed *__pptr = (typeof(__pptr))(ptr);		\
191*33b1fccfSAndroid Build Coastguard Worker 	__pptr->x = (val);							\
192*33b1fccfSAndroid Build Coastguard Worker } while (0)
193*33b1fccfSAndroid Build Coastguard Worker 
194*33b1fccfSAndroid Build Coastguard Worker #define get_unaligned(ptr)	__get_unaligned_t(typeof(*(ptr)), (ptr))
195*33b1fccfSAndroid Build Coastguard Worker #define put_unaligned(val, ptr) __put_unaligned_t(typeof(*(ptr)), (val), (ptr))
196*33b1fccfSAndroid Build Coastguard Worker 
get_unaligned_le32(const void * p)197*33b1fccfSAndroid Build Coastguard Worker static inline u32 get_unaligned_le32(const void *p)
198*33b1fccfSAndroid Build Coastguard Worker {
199*33b1fccfSAndroid Build Coastguard Worker 	return le32_to_cpu(__get_unaligned_t(__le32, p));
200*33b1fccfSAndroid Build Coastguard Worker }
201*33b1fccfSAndroid Build Coastguard Worker 
put_unaligned_le32(u32 val,void * p)202*33b1fccfSAndroid Build Coastguard Worker static inline void put_unaligned_le32(u32 val, void *p)
203*33b1fccfSAndroid Build Coastguard Worker {
204*33b1fccfSAndroid Build Coastguard Worker 	__put_unaligned_t(__le32, cpu_to_le32(val), p);
205*33b1fccfSAndroid Build Coastguard Worker }
206*33b1fccfSAndroid Build Coastguard Worker 
get_unaligned_le64(const void * p)207*33b1fccfSAndroid Build Coastguard Worker static inline u32 get_unaligned_le64(const void *p)
208*33b1fccfSAndroid Build Coastguard Worker {
209*33b1fccfSAndroid Build Coastguard Worker 	return le64_to_cpu(__get_unaligned_t(__le64, p));
210*33b1fccfSAndroid Build Coastguard Worker }
211*33b1fccfSAndroid Build Coastguard Worker 
212*33b1fccfSAndroid Build Coastguard Worker /**
213*33b1fccfSAndroid Build Coastguard Worker  * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
214*33b1fccfSAndroid Build Coastguard Worker  * @n - parameter
215*33b1fccfSAndroid Build Coastguard Worker  *
216*33b1fccfSAndroid Build Coastguard Worker  * constant-capable log of base 2 calculation
217*33b1fccfSAndroid Build Coastguard Worker  * - this can be used to initialise global variables from constant data, hence
218*33b1fccfSAndroid Build Coastguard Worker  *   the massive ternary operator construction
219*33b1fccfSAndroid Build Coastguard Worker  *
220*33b1fccfSAndroid Build Coastguard Worker  * selects the appropriately-sized optimised version depending on sizeof(n)
221*33b1fccfSAndroid Build Coastguard Worker  */
222*33b1fccfSAndroid Build Coastguard Worker #define ilog2(n)			\
223*33b1fccfSAndroid Build Coastguard Worker (					\
224*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 63) ? 63 :	\
225*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 62) ? 62 :	\
226*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 61) ? 61 :	\
227*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 60) ? 60 :	\
228*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 59) ? 59 :	\
229*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 58) ? 58 :	\
230*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 57) ? 57 :	\
231*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 56) ? 56 :	\
232*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 55) ? 55 :	\
233*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 54) ? 54 :	\
234*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 53) ? 53 :	\
235*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 52) ? 52 :	\
236*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 51) ? 51 :	\
237*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 50) ? 50 :	\
238*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 49) ? 49 :	\
239*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 48) ? 48 :	\
240*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 47) ? 47 :	\
241*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 46) ? 46 :	\
242*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 45) ? 45 :	\
243*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 44) ? 44 :	\
244*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 43) ? 43 :	\
245*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 42) ? 42 :	\
246*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 41) ? 41 :	\
247*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 40) ? 40 :	\
248*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 39) ? 39 :	\
249*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 38) ? 38 :	\
250*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 37) ? 37 :	\
251*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 36) ? 36 :	\
252*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 35) ? 35 :	\
253*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 34) ? 34 :	\
254*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 33) ? 33 :	\
255*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 32) ? 32 :	\
256*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 31) ? 31 :	\
257*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 30) ? 30 :	\
258*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 29) ? 29 :	\
259*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 28) ? 28 :	\
260*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 27) ? 27 :	\
261*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 26) ? 26 :	\
262*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 25) ? 25 :	\
263*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 24) ? 24 :	\
264*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 23) ? 23 :	\
265*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 22) ? 22 :	\
266*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 21) ? 21 :	\
267*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 20) ? 20 :	\
268*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 19) ? 19 :	\
269*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 18) ? 18 :	\
270*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 17) ? 17 :	\
271*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 16) ? 16 :	\
272*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 15) ? 15 :	\
273*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 14) ? 14 :	\
274*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 13) ? 13 :	\
275*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 12) ? 12 :	\
276*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 11) ? 11 :	\
277*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL << 10) ? 10 :	\
278*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL <<  9) ?  9 :	\
279*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL <<  8) ?  8 :	\
280*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL <<  7) ?  7 :	\
281*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL <<  6) ?  6 :	\
282*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL <<  5) ?  5 :	\
283*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL <<  4) ?  4 :	\
284*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL <<  3) ?  3 :	\
285*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL <<  2) ?  2 :	\
286*33b1fccfSAndroid Build Coastguard Worker 	(n) & (1ULL <<  1) ?  1 : 0	\
287*33b1fccfSAndroid Build Coastguard Worker )
288*33b1fccfSAndroid Build Coastguard Worker 
fls_long(unsigned long x)289*33b1fccfSAndroid Build Coastguard Worker static inline unsigned int fls_long(unsigned long x)
290*33b1fccfSAndroid Build Coastguard Worker {
291*33b1fccfSAndroid Build Coastguard Worker 	return x ? sizeof(x) * 8 - __builtin_clzl(x) : 0;
292*33b1fccfSAndroid Build Coastguard Worker }
293*33b1fccfSAndroid Build Coastguard Worker 
lowbit(unsigned long n)294*33b1fccfSAndroid Build Coastguard Worker static inline unsigned long lowbit(unsigned long n)
295*33b1fccfSAndroid Build Coastguard Worker {
296*33b1fccfSAndroid Build Coastguard Worker 	return n & -n;
297*33b1fccfSAndroid Build Coastguard Worker }
298*33b1fccfSAndroid Build Coastguard Worker 
299*33b1fccfSAndroid Build Coastguard Worker /**
300*33b1fccfSAndroid Build Coastguard Worker  * __roundup_pow_of_two() - round up to nearest power of two
301*33b1fccfSAndroid Build Coastguard Worker  * @n: value to round up
302*33b1fccfSAndroid Build Coastguard Worker  */
303*33b1fccfSAndroid Build Coastguard Worker static inline __attribute__((const))
__roundup_pow_of_two(unsigned long n)304*33b1fccfSAndroid Build Coastguard Worker unsigned long __roundup_pow_of_two(unsigned long n)
305*33b1fccfSAndroid Build Coastguard Worker {
306*33b1fccfSAndroid Build Coastguard Worker 	return 1UL << fls_long(n - 1);
307*33b1fccfSAndroid Build Coastguard Worker }
308*33b1fccfSAndroid Build Coastguard Worker 
309*33b1fccfSAndroid Build Coastguard Worker /**
310*33b1fccfSAndroid Build Coastguard Worker  * roundup_pow_of_two - round the given value up to nearest power of two
311*33b1fccfSAndroid Build Coastguard Worker  * @n: parameter
312*33b1fccfSAndroid Build Coastguard Worker  *
313*33b1fccfSAndroid Build Coastguard Worker  * round the given value up to the nearest power of two
314*33b1fccfSAndroid Build Coastguard Worker  * - the result is undefined when n == 0
315*33b1fccfSAndroid Build Coastguard Worker  * - this can be used to initialise global variables from constant data
316*33b1fccfSAndroid Build Coastguard Worker  */
317*33b1fccfSAndroid Build Coastguard Worker #define roundup_pow_of_two(n)			\
318*33b1fccfSAndroid Build Coastguard Worker (						\
319*33b1fccfSAndroid Build Coastguard Worker 	__builtin_constant_p(n) ? (		\
320*33b1fccfSAndroid Build Coastguard Worker 		((n) == 1) ? 1 :		\
321*33b1fccfSAndroid Build Coastguard Worker 		(1UL << (ilog2((n) - 1) + 1))	\
322*33b1fccfSAndroid Build Coastguard Worker 				   ) :		\
323*33b1fccfSAndroid Build Coastguard Worker 	__roundup_pow_of_two(n)			\
324*33b1fccfSAndroid Build Coastguard Worker )
325*33b1fccfSAndroid Build Coastguard Worker 
326*33b1fccfSAndroid Build Coastguard Worker #ifndef __always_inline
327*33b1fccfSAndroid Build Coastguard Worker #define __always_inline	inline
328*33b1fccfSAndroid Build Coastguard Worker #endif
329*33b1fccfSAndroid Build Coastguard Worker 
330*33b1fccfSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_STAT_ST_ATIM
331*33b1fccfSAndroid Build Coastguard Worker /* Linux */
332*33b1fccfSAndroid Build Coastguard Worker #define ST_ATIM_NSEC(stbuf) ((stbuf)->st_atim.tv_nsec)
333*33b1fccfSAndroid Build Coastguard Worker #define ST_CTIM_NSEC(stbuf) ((stbuf)->st_ctim.tv_nsec)
334*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC(stbuf) ((stbuf)->st_mtim.tv_nsec)
335*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC_SET(stbuf, val) (stbuf)->st_mtim.tv_nsec = (val)
336*33b1fccfSAndroid Build Coastguard Worker #elif defined(HAVE_STRUCT_STAT_ST_ATIMENSEC)
337*33b1fccfSAndroid Build Coastguard Worker /* macOS */
338*33b1fccfSAndroid Build Coastguard Worker #define ST_ATIM_NSEC(stbuf) ((stbuf)->st_atimensec)
339*33b1fccfSAndroid Build Coastguard Worker #define ST_CTIM_NSEC(stbuf) ((stbuf)->st_ctimensec)
340*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC(stbuf) ((stbuf)->st_mtimensec)
341*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC_SET(stbuf, val) (stbuf)->st_mtimensec = (val)
342*33b1fccfSAndroid Build Coastguard Worker #else
343*33b1fccfSAndroid Build Coastguard Worker #define ST_ATIM_NSEC(stbuf) 0
344*33b1fccfSAndroid Build Coastguard Worker #define ST_CTIM_NSEC(stbuf) 0
345*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC(stbuf) 0
346*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC_SET(stbuf, val) do { } while (0)
347*33b1fccfSAndroid Build Coastguard Worker #endif
348*33b1fccfSAndroid Build Coastguard Worker 
349*33b1fccfSAndroid Build Coastguard Worker #define __erofs_likely(x)      __builtin_expect(!!(x), 1)
350*33b1fccfSAndroid Build Coastguard Worker #define __erofs_unlikely(x)    __builtin_expect(!!(x), 0)
351*33b1fccfSAndroid Build Coastguard Worker 
352*33b1fccfSAndroid Build Coastguard Worker #ifdef __cplusplus
353*33b1fccfSAndroid Build Coastguard Worker }
354*33b1fccfSAndroid Build Coastguard Worker #endif
355*33b1fccfSAndroid Build Coastguard Worker 
356*33b1fccfSAndroid Build Coastguard Worker #endif
357