1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #include <linux/export.h> 3 #include <linux/linkage.h> 4 5 #include <asm/asm.h> 6 7 /* 8 * unsigned int __sw_hweight32(unsigned int w) 9 * %rdi: w 10 */ 11 SYM_FUNC_START(__sw_hweight32) 12 13 #ifdef CONFIG_X86_64 14 movl %edi, %eax 15 #endif 16 __ASM_SIZE(push,) %__ASM_REG(dx) 17 movl %eax, %edx 18 shrl %edx 19 andl $0x55555555, %edx 20 subl %edx, %eax 21 22 movl %eax, %edx 23 shrl $2, %eax 24 andl $0x33333333, %edx 25 andl $0x33333333, %eax 26 addl %edx, %eax 27 28 movl %eax, %edx 29 shrl $4, %edx 30 addl %edx, %eax 31 andl $0x0f0f0f0f, %eax 32 imull $0x01010101, %eax, %eax 33 shrl $24, %eax 34 __ASM_SIZE(pop,) %__ASM_REG(dx) 35 RET 36 SYM_FUNC_END(__sw_hweight32) 37 EXPORT_SYMBOL(__sw_hweight32) 38 39 /* 40 * No 32-bit variant, because it's implemented 41 * on top of __arch_hweight32(): 42 */ 43 #ifdef CONFIG_X86_64 44 SYM_FUNC_START(__sw_hweight64) 45 pushq %rdi 46 pushq %rdx 47 48 movq %rdi, %rdx 49 movabsq $0x5555555555555555, %rax 50 shrq %rdx 51 andq %rdx, %rax 52 movabsq $0x3333333333333333, %rdx 53 subq %rax, %rdi 54 55 movq %rdi, %rax 56 shrq $2, %rdi 57 andq %rdx, %rax 58 andq %rdi, %rdx 59 addq %rdx, %rax 60 61 movq %rax, %rdx 62 shrq $4, %rdx 63 addq %rdx, %rax 64 movabsq $0x0f0f0f0f0f0f0f0f, %rdx 65 andq %rdx, %rax 66 movabsq $0x0101010101010101, %rdx 67 imulq %rdx, %rax 68 shrq $56, %rax 69 70 popq %rdx 71 popq %rdi 72 RET 73 SYM_FUNC_END(__sw_hweight64) 74 EXPORT_SYMBOL(__sw_hweight64) 75 #endif
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.