^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) IBM Corporation, 2010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Author: Anton Blanchard <anton@au.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/ppc_asm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/feature-fixups.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /* Note: This code relies on -mminimal-toc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) _GLOBAL(__arch_hweight8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) b __sw_hweight8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) PPC_POPCNTB(R3,R3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) clrldi r3,r3,64-8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) EXPORT_SYMBOL(__arch_hweight8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) _GLOBAL(__arch_hweight16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) b __sw_hweight16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) BEGIN_FTR_SECTION_NESTED(50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) PPC_POPCNTB(R3,R3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) srdi r4,r3,8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) add r3,r4,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) clrldi r3,r3,64-8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) FTR_SECTION_ELSE_NESTED(50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) clrlwi r3,r3,16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) PPC_POPCNTW(R3,R3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) clrldi r3,r3,64-8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) EXPORT_SYMBOL(__arch_hweight16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) _GLOBAL(__arch_hweight32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) b __sw_hweight32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) BEGIN_FTR_SECTION_NESTED(51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) PPC_POPCNTB(R3,R3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) srdi r4,r3,16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) add r3,r4,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) srdi r4,r3,8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) add r3,r4,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) clrldi r3,r3,64-8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) FTR_SECTION_ELSE_NESTED(51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) PPC_POPCNTW(R3,R3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) clrldi r3,r3,64-8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) EXPORT_SYMBOL(__arch_hweight32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) _GLOBAL(__arch_hweight64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) b __sw_hweight64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) BEGIN_FTR_SECTION_NESTED(52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) PPC_POPCNTB(R3,R3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) srdi r4,r3,32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) add r3,r4,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) srdi r4,r3,16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) add r3,r4,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) srdi r4,r3,8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) add r3,r4,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) clrldi r3,r3,64-8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) FTR_SECTION_ELSE_NESTED(52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) PPC_POPCNTD(R3,R3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) clrldi r3,r3,64-8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_POPCNTD, 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ALT_FTR_SECTION_END_IFCLR(CPU_FTR_POPCNTB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) EXPORT_SYMBOL(__arch_hweight64)