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