File Index
Files and directories
Sign in
FILE

arch_hweight.h

File preview with syntax highlighting.

linux-6.19.14/arch/s390/include/asm/arch_hweight.h C
 1/* SPDX-License-Identifier: GPL-2.0 */
 2
 3#ifndef _ASM_S390_ARCH_HWEIGHT_H
 4#define _ASM_S390_ARCH_HWEIGHT_H
 5
 6#include <linux/types.h>
 7#include <asm/march.h>
 8
 9static __always_inline unsigned long popcnt_z196(unsigned long w)
10{
11	unsigned long cnt;
12
13	asm volatile(".insn	rrf,0xb9e10000,%[cnt],%[w],0,0"
14		     : [cnt] "=d" (cnt)
15		     : [w] "d" (w)
16		     : "cc");
17	return cnt;
18}
19
20static __always_inline unsigned long popcnt_z15(unsigned long w)
21{
22	unsigned long cnt;
23
24	asm volatile(".insn	rrf,0xb9e10000,%[cnt],%[w],8,0"
25		     : [cnt] "=d" (cnt)
26		     : [w] "d" (w)
27		     : "cc");
28	return cnt;
29}
30
31static __always_inline unsigned long __arch_hweight64(__u64 w)
32{
33	if (__is_defined(MARCH_HAS_Z15_FEATURES))
34		return popcnt_z15(w);
35	if (__is_defined(MARCH_HAS_Z196_FEATURES)) {
36		w = popcnt_z196(w);
37		w += w >> 32;
38		w += w >> 16;
39		w += w >> 8;
40		return w & 0xff;
41	}
42	return __sw_hweight64(w);
43}
44
45static __always_inline unsigned int __arch_hweight32(unsigned int w)
46{
47	if (__is_defined(MARCH_HAS_Z15_FEATURES))
48		return popcnt_z15(w);
49	if (__is_defined(MARCH_HAS_Z196_FEATURES)) {
50		w = popcnt_z196(w);
51		w += w >> 16;
52		w += w >> 8;
53		return w & 0xff;
54	}
55	return __sw_hweight32(w);
56}
57
58static __always_inline unsigned int __arch_hweight16(unsigned int w)
59{
60	if (__is_defined(MARCH_HAS_Z15_FEATURES))
61		return popcnt_z15((unsigned short)w);
62	if (__is_defined(MARCH_HAS_Z196_FEATURES)) {
63		w = popcnt_z196(w);
64		w += w >> 8;
65		return w & 0xff;
66	}
67	return __sw_hweight16(w);
68}
69
70static __always_inline unsigned int __arch_hweight8(unsigned int w)
71{
72	if (__is_defined(MARCH_HAS_Z196_FEATURES))
73		return popcnt_z196((unsigned char)w);
74	return __sw_hweight8(w);
75}
76
77#endif /* _ASM_S390_ARCH_HWEIGHT_H */
~/ Read-only file preview.