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

arch_hweight.h (1083B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_X86_HWEIGHT_H
      3#define _ASM_X86_HWEIGHT_H
      4
      5#include <asm/cpufeatures.h>
      6
      7#ifdef CONFIG_64BIT
      8#define REG_IN "D"
      9#define REG_OUT "a"
     10#else
     11#define REG_IN "a"
     12#define REG_OUT "a"
     13#endif
     14
     15static __always_inline unsigned int __arch_hweight32(unsigned int w)
     16{
     17	unsigned int res;
     18
     19	asm (ALTERNATIVE("call __sw_hweight32", "popcntl %1, %0", X86_FEATURE_POPCNT)
     20			 : "="REG_OUT (res)
     21			 : REG_IN (w));
     22
     23	return res;
     24}
     25
     26static inline unsigned int __arch_hweight16(unsigned int w)
     27{
     28	return __arch_hweight32(w & 0xffff);
     29}
     30
     31static inline unsigned int __arch_hweight8(unsigned int w)
     32{
     33	return __arch_hweight32(w & 0xff);
     34}
     35
     36#ifdef CONFIG_X86_32
     37static inline unsigned long __arch_hweight64(__u64 w)
     38{
     39	return  __arch_hweight32((u32)w) +
     40		__arch_hweight32((u32)(w >> 32));
     41}
     42#else
     43static __always_inline unsigned long __arch_hweight64(__u64 w)
     44{
     45	unsigned long res;
     46
     47	asm (ALTERNATIVE("call __sw_hweight64", "popcntq %1, %0", X86_FEATURE_POPCNT)
     48			 : "="REG_OUT (res)
     49			 : REG_IN (w));
     50
     51	return res;
     52}
     53#endif /* CONFIG_X86_32 */
     54
     55#endif