cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

__fls.h (920B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_GENERIC_BITOPS___FLS_H_
      3#define _ASM_GENERIC_BITOPS___FLS_H_
      4
      5#include <asm/types.h>
      6
      7/**
      8 * __fls - find last (most-significant) set bit in a long word
      9 * @word: the word to search
     10 *
     11 * Undefined if no set bit exists, so code should check against 0 first.
     12 */
     13static __always_inline unsigned long __fls(unsigned long word)
     14{
     15	int num = BITS_PER_LONG - 1;
     16
     17#if BITS_PER_LONG == 64
     18	if (!(word & (~0ul << 32))) {
     19		num -= 32;
     20		word <<= 32;
     21	}
     22#endif
     23	if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
     24		num -= 16;
     25		word <<= 16;
     26	}
     27	if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
     28		num -= 8;
     29		word <<= 8;
     30	}
     31	if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
     32		num -= 4;
     33		word <<= 4;
     34	}
     35	if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
     36		num -= 2;
     37		word <<= 2;
     38	}
     39	if (!(word & (~0ul << (BITS_PER_LONG-1))))
     40		num -= 1;
     41	return num;
     42}
     43
     44#endif /* _ASM_GENERIC_BITOPS___FLS_H_ */