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

clz_ctz.c (1186B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * lib/clz_ctz.c
      4 *
      5 * Copyright (C) 2013 Chanho Min <chanho.min@lge.com>
      6 *
      7 * The functions in this file aren't called directly, but are required by
      8 * GCC builtins such as __builtin_ctz, and therefore they can't be removed
      9 * despite appearing unreferenced in kernel source.
     10 *
     11 * __c[lt]z[sd]i2 can be overridden by linking arch-specific versions.
     12 */
     13
     14#include <linux/export.h>
     15#include <linux/kernel.h>
     16
     17int __weak __ctzsi2(int val);
     18int __weak __ctzsi2(int val)
     19{
     20	return __ffs(val);
     21}
     22EXPORT_SYMBOL(__ctzsi2);
     23
     24int __weak __clzsi2(int val);
     25int __weak __clzsi2(int val)
     26{
     27	return 32 - fls(val);
     28}
     29EXPORT_SYMBOL(__clzsi2);
     30
     31int __weak __clzdi2(long val);
     32int __weak __ctzdi2(long val);
     33#if BITS_PER_LONG == 32
     34
     35int __weak __clzdi2(long val)
     36{
     37	return 32 - fls((int)val);
     38}
     39EXPORT_SYMBOL(__clzdi2);
     40
     41int __weak __ctzdi2(long val)
     42{
     43	return __ffs((u32)val);
     44}
     45EXPORT_SYMBOL(__ctzdi2);
     46
     47#elif BITS_PER_LONG == 64
     48
     49int __weak __clzdi2(long val)
     50{
     51	return 64 - fls64((u64)val);
     52}
     53EXPORT_SYMBOL(__clzdi2);
     54
     55int __weak __ctzdi2(long val)
     56{
     57	return __ffs64((u64)val);
     58}
     59EXPORT_SYMBOL(__ctzdi2);
     60
     61#else
     62#error BITS_PER_LONG not 32 or 64
     63#endif