1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _ASM_X86_BITOPS_H
3*4882a593Smuzhiyun #define _ASM_X86_BITOPS_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun * Copyright 1992, Linus Torvalds.
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Note: inlines with more than a single statement should be marked
9*4882a593Smuzhiyun * __always_inline to avoid problems with older gcc's inlining heuristics.
10*4882a593Smuzhiyun */
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #ifndef _LINUX_BITOPS_H
13*4882a593Smuzhiyun #error only <linux/bitops.h> can be included directly
14*4882a593Smuzhiyun #endif
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #include <linux/compiler.h>
17*4882a593Smuzhiyun #include <asm/alternative.h>
18*4882a593Smuzhiyun #include <asm/rmwcc.h>
19*4882a593Smuzhiyun #include <asm/barrier.h>
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #if BITS_PER_LONG == 32
22*4882a593Smuzhiyun # define _BITOPS_LONG_SHIFT 5
23*4882a593Smuzhiyun #elif BITS_PER_LONG == 64
24*4882a593Smuzhiyun # define _BITOPS_LONG_SHIFT 6
25*4882a593Smuzhiyun #else
26*4882a593Smuzhiyun # error "Unexpected BITS_PER_LONG"
27*4882a593Smuzhiyun #endif
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #define BIT_64(n) (U64_C(1) << (n))
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun /*
32*4882a593Smuzhiyun * These have to be done with inline assembly: that way the bit-setting
33*4882a593Smuzhiyun * is guaranteed to be atomic. All bit operations return 0 if the bit
34*4882a593Smuzhiyun * was cleared before the operation and != 0 if it was not.
35*4882a593Smuzhiyun *
36*4882a593Smuzhiyun * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
37*4882a593Smuzhiyun */
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #define RLONG_ADDR(x) "m" (*(volatile long *) (x))
40*4882a593Smuzhiyun #define WBYTE_ADDR(x) "+m" (*(volatile char *) (x))
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun #define ADDR RLONG_ADDR(addr)
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun * We do the locked ops that don't return the old value as
46*4882a593Smuzhiyun * a mask operation on a byte.
47*4882a593Smuzhiyun */
48*4882a593Smuzhiyun #define CONST_MASK_ADDR(nr, addr) WBYTE_ADDR((void *)(addr) + ((nr)>>3))
49*4882a593Smuzhiyun #define CONST_MASK(nr) (1 << ((nr) & 7))
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun static __always_inline void
arch_set_bit(long nr,volatile unsigned long * addr)52*4882a593Smuzhiyun arch_set_bit(long nr, volatile unsigned long *addr)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun if (__builtin_constant_p(nr)) {
55*4882a593Smuzhiyun asm volatile(LOCK_PREFIX "orb %b1,%0"
56*4882a593Smuzhiyun : CONST_MASK_ADDR(nr, addr)
57*4882a593Smuzhiyun : "iq" (CONST_MASK(nr))
58*4882a593Smuzhiyun : "memory");
59*4882a593Smuzhiyun } else {
60*4882a593Smuzhiyun asm volatile(LOCK_PREFIX __ASM_SIZE(bts) " %1,%0"
61*4882a593Smuzhiyun : : RLONG_ADDR(addr), "Ir" (nr) : "memory");
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun static __always_inline void
arch___set_bit(long nr,volatile unsigned long * addr)66*4882a593Smuzhiyun arch___set_bit(long nr, volatile unsigned long *addr)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun asm volatile(__ASM_SIZE(bts) " %1,%0" : : ADDR, "Ir" (nr) : "memory");
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun static __always_inline void
arch_clear_bit(long nr,volatile unsigned long * addr)72*4882a593Smuzhiyun arch_clear_bit(long nr, volatile unsigned long *addr)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun if (__builtin_constant_p(nr)) {
75*4882a593Smuzhiyun asm volatile(LOCK_PREFIX "andb %b1,%0"
76*4882a593Smuzhiyun : CONST_MASK_ADDR(nr, addr)
77*4882a593Smuzhiyun : "iq" (~CONST_MASK(nr)));
78*4882a593Smuzhiyun } else {
79*4882a593Smuzhiyun asm volatile(LOCK_PREFIX __ASM_SIZE(btr) " %1,%0"
80*4882a593Smuzhiyun : : RLONG_ADDR(addr), "Ir" (nr) : "memory");
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun static __always_inline void
arch_clear_bit_unlock(long nr,volatile unsigned long * addr)85*4882a593Smuzhiyun arch_clear_bit_unlock(long nr, volatile unsigned long *addr)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun barrier();
88*4882a593Smuzhiyun arch_clear_bit(nr, addr);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun static __always_inline void
arch___clear_bit(long nr,volatile unsigned long * addr)92*4882a593Smuzhiyun arch___clear_bit(long nr, volatile unsigned long *addr)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun asm volatile(__ASM_SIZE(btr) " %1,%0" : : ADDR, "Ir" (nr) : "memory");
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun static __always_inline bool
arch_clear_bit_unlock_is_negative_byte(long nr,volatile unsigned long * addr)98*4882a593Smuzhiyun arch_clear_bit_unlock_is_negative_byte(long nr, volatile unsigned long *addr)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun bool negative;
101*4882a593Smuzhiyun asm volatile(LOCK_PREFIX "andb %2,%1"
102*4882a593Smuzhiyun CC_SET(s)
103*4882a593Smuzhiyun : CC_OUT(s) (negative), WBYTE_ADDR(addr)
104*4882a593Smuzhiyun : "ir" ((char) ~(1 << nr)) : "memory");
105*4882a593Smuzhiyun return negative;
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun #define arch_clear_bit_unlock_is_negative_byte \
108*4882a593Smuzhiyun arch_clear_bit_unlock_is_negative_byte
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun static __always_inline void
arch___clear_bit_unlock(long nr,volatile unsigned long * addr)111*4882a593Smuzhiyun arch___clear_bit_unlock(long nr, volatile unsigned long *addr)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun arch___clear_bit(nr, addr);
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun static __always_inline void
arch___change_bit(long nr,volatile unsigned long * addr)117*4882a593Smuzhiyun arch___change_bit(long nr, volatile unsigned long *addr)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun asm volatile(__ASM_SIZE(btc) " %1,%0" : : ADDR, "Ir" (nr) : "memory");
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun static __always_inline void
arch_change_bit(long nr,volatile unsigned long * addr)123*4882a593Smuzhiyun arch_change_bit(long nr, volatile unsigned long *addr)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun if (__builtin_constant_p(nr)) {
126*4882a593Smuzhiyun asm volatile(LOCK_PREFIX "xorb %b1,%0"
127*4882a593Smuzhiyun : CONST_MASK_ADDR(nr, addr)
128*4882a593Smuzhiyun : "iq" (CONST_MASK(nr)));
129*4882a593Smuzhiyun } else {
130*4882a593Smuzhiyun asm volatile(LOCK_PREFIX __ASM_SIZE(btc) " %1,%0"
131*4882a593Smuzhiyun : : RLONG_ADDR(addr), "Ir" (nr) : "memory");
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun static __always_inline bool
arch_test_and_set_bit(long nr,volatile unsigned long * addr)136*4882a593Smuzhiyun arch_test_and_set_bit(long nr, volatile unsigned long *addr)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun return GEN_BINARY_RMWcc(LOCK_PREFIX __ASM_SIZE(bts), *addr, c, "Ir", nr);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun static __always_inline bool
arch_test_and_set_bit_lock(long nr,volatile unsigned long * addr)142*4882a593Smuzhiyun arch_test_and_set_bit_lock(long nr, volatile unsigned long *addr)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun return arch_test_and_set_bit(nr, addr);
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun static __always_inline bool
arch___test_and_set_bit(long nr,volatile unsigned long * addr)148*4882a593Smuzhiyun arch___test_and_set_bit(long nr, volatile unsigned long *addr)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun bool oldbit;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun asm(__ASM_SIZE(bts) " %2,%1"
153*4882a593Smuzhiyun CC_SET(c)
154*4882a593Smuzhiyun : CC_OUT(c) (oldbit)
155*4882a593Smuzhiyun : ADDR, "Ir" (nr) : "memory");
156*4882a593Smuzhiyun return oldbit;
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun static __always_inline bool
arch_test_and_clear_bit(long nr,volatile unsigned long * addr)160*4882a593Smuzhiyun arch_test_and_clear_bit(long nr, volatile unsigned long *addr)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun return GEN_BINARY_RMWcc(LOCK_PREFIX __ASM_SIZE(btr), *addr, c, "Ir", nr);
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun /*
166*4882a593Smuzhiyun * Note: the operation is performed atomically with respect to
167*4882a593Smuzhiyun * the local CPU, but not other CPUs. Portable code should not
168*4882a593Smuzhiyun * rely on this behaviour.
169*4882a593Smuzhiyun * KVM relies on this behaviour on x86 for modifying memory that is also
170*4882a593Smuzhiyun * accessed from a hypervisor on the same CPU if running in a VM: don't change
171*4882a593Smuzhiyun * this without also updating arch/x86/kernel/kvm.c
172*4882a593Smuzhiyun */
173*4882a593Smuzhiyun static __always_inline bool
arch___test_and_clear_bit(long nr,volatile unsigned long * addr)174*4882a593Smuzhiyun arch___test_and_clear_bit(long nr, volatile unsigned long *addr)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun bool oldbit;
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun asm volatile(__ASM_SIZE(btr) " %2,%1"
179*4882a593Smuzhiyun CC_SET(c)
180*4882a593Smuzhiyun : CC_OUT(c) (oldbit)
181*4882a593Smuzhiyun : ADDR, "Ir" (nr) : "memory");
182*4882a593Smuzhiyun return oldbit;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun static __always_inline bool
arch___test_and_change_bit(long nr,volatile unsigned long * addr)186*4882a593Smuzhiyun arch___test_and_change_bit(long nr, volatile unsigned long *addr)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun bool oldbit;
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun asm volatile(__ASM_SIZE(btc) " %2,%1"
191*4882a593Smuzhiyun CC_SET(c)
192*4882a593Smuzhiyun : CC_OUT(c) (oldbit)
193*4882a593Smuzhiyun : ADDR, "Ir" (nr) : "memory");
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun return oldbit;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun static __always_inline bool
arch_test_and_change_bit(long nr,volatile unsigned long * addr)199*4882a593Smuzhiyun arch_test_and_change_bit(long nr, volatile unsigned long *addr)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun return GEN_BINARY_RMWcc(LOCK_PREFIX __ASM_SIZE(btc), *addr, c, "Ir", nr);
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun
constant_test_bit(long nr,const volatile unsigned long * addr)204*4882a593Smuzhiyun static __always_inline bool constant_test_bit(long nr, const volatile unsigned long *addr)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun return ((1UL << (nr & (BITS_PER_LONG-1))) &
207*4882a593Smuzhiyun (addr[nr >> _BITOPS_LONG_SHIFT])) != 0;
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun
variable_test_bit(long nr,volatile const unsigned long * addr)210*4882a593Smuzhiyun static __always_inline bool variable_test_bit(long nr, volatile const unsigned long *addr)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun bool oldbit;
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun asm volatile(__ASM_SIZE(bt) " %2,%1"
215*4882a593Smuzhiyun CC_SET(c)
216*4882a593Smuzhiyun : CC_OUT(c) (oldbit)
217*4882a593Smuzhiyun : "m" (*(unsigned long *)addr), "Ir" (nr) : "memory");
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun return oldbit;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun #define arch_test_bit(nr, addr) \
223*4882a593Smuzhiyun (__builtin_constant_p((nr)) \
224*4882a593Smuzhiyun ? constant_test_bit((nr), (addr)) \
225*4882a593Smuzhiyun : variable_test_bit((nr), (addr)))
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun /**
228*4882a593Smuzhiyun * __ffs - find first set bit in word
229*4882a593Smuzhiyun * @word: The word to search
230*4882a593Smuzhiyun *
231*4882a593Smuzhiyun * Undefined if no bit exists, so code should check against 0 first.
232*4882a593Smuzhiyun */
__ffs(unsigned long word)233*4882a593Smuzhiyun static __always_inline unsigned long __ffs(unsigned long word)
234*4882a593Smuzhiyun {
235*4882a593Smuzhiyun asm("rep; bsf %1,%0"
236*4882a593Smuzhiyun : "=r" (word)
237*4882a593Smuzhiyun : "rm" (word));
238*4882a593Smuzhiyun return word;
239*4882a593Smuzhiyun }
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun /**
242*4882a593Smuzhiyun * ffz - find first zero bit in word
243*4882a593Smuzhiyun * @word: The word to search
244*4882a593Smuzhiyun *
245*4882a593Smuzhiyun * Undefined if no zero exists, so code should check against ~0UL first.
246*4882a593Smuzhiyun */
ffz(unsigned long word)247*4882a593Smuzhiyun static __always_inline unsigned long ffz(unsigned long word)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun asm("rep; bsf %1,%0"
250*4882a593Smuzhiyun : "=r" (word)
251*4882a593Smuzhiyun : "r" (~word));
252*4882a593Smuzhiyun return word;
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun /*
256*4882a593Smuzhiyun * __fls: find last set bit in word
257*4882a593Smuzhiyun * @word: The word to search
258*4882a593Smuzhiyun *
259*4882a593Smuzhiyun * Undefined if no set bit exists, so code should check against 0 first.
260*4882a593Smuzhiyun */
__fls(unsigned long word)261*4882a593Smuzhiyun static __always_inline unsigned long __fls(unsigned long word)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun asm("bsr %1,%0"
264*4882a593Smuzhiyun : "=r" (word)
265*4882a593Smuzhiyun : "rm" (word));
266*4882a593Smuzhiyun return word;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun #undef ADDR
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun #ifdef __KERNEL__
272*4882a593Smuzhiyun /**
273*4882a593Smuzhiyun * ffs - find first set bit in word
274*4882a593Smuzhiyun * @x: the word to search
275*4882a593Smuzhiyun *
276*4882a593Smuzhiyun * This is defined the same way as the libc and compiler builtin ffs
277*4882a593Smuzhiyun * routines, therefore differs in spirit from the other bitops.
278*4882a593Smuzhiyun *
279*4882a593Smuzhiyun * ffs(value) returns 0 if value is 0 or the position of the first
280*4882a593Smuzhiyun * set bit if value is nonzero. The first (least significant) bit
281*4882a593Smuzhiyun * is at position 1.
282*4882a593Smuzhiyun */
ffs(int x)283*4882a593Smuzhiyun static __always_inline int ffs(int x)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun int r;
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun #ifdef CONFIG_X86_64
288*4882a593Smuzhiyun /*
289*4882a593Smuzhiyun * AMD64 says BSFL won't clobber the dest reg if x==0; Intel64 says the
290*4882a593Smuzhiyun * dest reg is undefined if x==0, but their CPU architect says its
291*4882a593Smuzhiyun * value is written to set it to the same as before, except that the
292*4882a593Smuzhiyun * top 32 bits will be cleared.
293*4882a593Smuzhiyun *
294*4882a593Smuzhiyun * We cannot do this on 32 bits because at the very least some
295*4882a593Smuzhiyun * 486 CPUs did not behave this way.
296*4882a593Smuzhiyun */
297*4882a593Smuzhiyun asm("bsfl %1,%0"
298*4882a593Smuzhiyun : "=r" (r)
299*4882a593Smuzhiyun : "rm" (x), "0" (-1));
300*4882a593Smuzhiyun #elif defined(CONFIG_X86_CMOV)
301*4882a593Smuzhiyun asm("bsfl %1,%0\n\t"
302*4882a593Smuzhiyun "cmovzl %2,%0"
303*4882a593Smuzhiyun : "=&r" (r) : "rm" (x), "r" (-1));
304*4882a593Smuzhiyun #else
305*4882a593Smuzhiyun asm("bsfl %1,%0\n\t"
306*4882a593Smuzhiyun "jnz 1f\n\t"
307*4882a593Smuzhiyun "movl $-1,%0\n"
308*4882a593Smuzhiyun "1:" : "=r" (r) : "rm" (x));
309*4882a593Smuzhiyun #endif
310*4882a593Smuzhiyun return r + 1;
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun /**
314*4882a593Smuzhiyun * fls - find last set bit in word
315*4882a593Smuzhiyun * @x: the word to search
316*4882a593Smuzhiyun *
317*4882a593Smuzhiyun * This is defined in a similar way as the libc and compiler builtin
318*4882a593Smuzhiyun * ffs, but returns the position of the most significant set bit.
319*4882a593Smuzhiyun *
320*4882a593Smuzhiyun * fls(value) returns 0 if value is 0 or the position of the last
321*4882a593Smuzhiyun * set bit if value is nonzero. The last (most significant) bit is
322*4882a593Smuzhiyun * at position 32.
323*4882a593Smuzhiyun */
fls(unsigned int x)324*4882a593Smuzhiyun static __always_inline int fls(unsigned int x)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun int r;
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun #ifdef CONFIG_X86_64
329*4882a593Smuzhiyun /*
330*4882a593Smuzhiyun * AMD64 says BSRL won't clobber the dest reg if x==0; Intel64 says the
331*4882a593Smuzhiyun * dest reg is undefined if x==0, but their CPU architect says its
332*4882a593Smuzhiyun * value is written to set it to the same as before, except that the
333*4882a593Smuzhiyun * top 32 bits will be cleared.
334*4882a593Smuzhiyun *
335*4882a593Smuzhiyun * We cannot do this on 32 bits because at the very least some
336*4882a593Smuzhiyun * 486 CPUs did not behave this way.
337*4882a593Smuzhiyun */
338*4882a593Smuzhiyun asm("bsrl %1,%0"
339*4882a593Smuzhiyun : "=r" (r)
340*4882a593Smuzhiyun : "rm" (x), "0" (-1));
341*4882a593Smuzhiyun #elif defined(CONFIG_X86_CMOV)
342*4882a593Smuzhiyun asm("bsrl %1,%0\n\t"
343*4882a593Smuzhiyun "cmovzl %2,%0"
344*4882a593Smuzhiyun : "=&r" (r) : "rm" (x), "rm" (-1));
345*4882a593Smuzhiyun #else
346*4882a593Smuzhiyun asm("bsrl %1,%0\n\t"
347*4882a593Smuzhiyun "jnz 1f\n\t"
348*4882a593Smuzhiyun "movl $-1,%0\n"
349*4882a593Smuzhiyun "1:" : "=r" (r) : "rm" (x));
350*4882a593Smuzhiyun #endif
351*4882a593Smuzhiyun return r + 1;
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun /**
355*4882a593Smuzhiyun * fls64 - find last set bit in a 64-bit word
356*4882a593Smuzhiyun * @x: the word to search
357*4882a593Smuzhiyun *
358*4882a593Smuzhiyun * This is defined in a similar way as the libc and compiler builtin
359*4882a593Smuzhiyun * ffsll, but returns the position of the most significant set bit.
360*4882a593Smuzhiyun *
361*4882a593Smuzhiyun * fls64(value) returns 0 if value is 0 or the position of the last
362*4882a593Smuzhiyun * set bit if value is nonzero. The last (most significant) bit is
363*4882a593Smuzhiyun * at position 64.
364*4882a593Smuzhiyun */
365*4882a593Smuzhiyun #ifdef CONFIG_X86_64
fls64(__u64 x)366*4882a593Smuzhiyun static __always_inline int fls64(__u64 x)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun int bitpos = -1;
369*4882a593Smuzhiyun /*
370*4882a593Smuzhiyun * AMD64 says BSRQ won't clobber the dest reg if x==0; Intel64 says the
371*4882a593Smuzhiyun * dest reg is undefined if x==0, but their CPU architect says its
372*4882a593Smuzhiyun * value is written to set it to the same as before.
373*4882a593Smuzhiyun */
374*4882a593Smuzhiyun asm("bsrq %1,%q0"
375*4882a593Smuzhiyun : "+r" (bitpos)
376*4882a593Smuzhiyun : "rm" (x));
377*4882a593Smuzhiyun return bitpos + 1;
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun #else
380*4882a593Smuzhiyun #include <asm-generic/bitops/fls64.h>
381*4882a593Smuzhiyun #endif
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun #include <asm-generic/bitops/find.h>
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun #include <asm-generic/bitops/sched.h>
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun #include <asm/arch_hweight.h>
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun #include <asm-generic/bitops/const_hweight.h>
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun #include <asm-generic/bitops/instrumented-atomic.h>
392*4882a593Smuzhiyun #include <asm-generic/bitops/instrumented-non-atomic.h>
393*4882a593Smuzhiyun #include <asm-generic/bitops/instrumented-lock.h>
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun #include <asm-generic/bitops/le.h>
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun #include <asm-generic/bitops/ext2-atomic-setbit.h>
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun #endif /* __KERNEL__ */
400*4882a593Smuzhiyun #endif /* _ASM_X86_BITOPS_H */
401