diff options
| author | David S. Miller <davem@davemloft.net> | 2011-08-07 23:20:26 -0700 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-08-07 23:20:26 -0700 |
| commit | 19fd61785a580c60cba900c5171bfadb57dd5056 (patch) | |
| tree | 1e491fb014be0dc03f4b6755bb94e73afd38c455 /arch/sparc/kernel/unaligned_64.c | |
| parent | 57569d0e12eaf31717e295960cd2a26f626c8e5b (diff) | |
| parent | 8028837d71ba9904b17281b40f94b93e947fbe38 (diff) | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'arch/sparc/kernel/unaligned_64.c')
| -rw-r--r-- | arch/sparc/kernel/unaligned_64.c | 15 |
1 files changed, 4 insertions, 11 deletions
diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c index 35cff1673aa4..76e4ac1a13e1 100644 --- a/arch/sparc/kernel/unaligned_64.c +++ b/arch/sparc/kernel/unaligned_64.c @@ -22,6 +22,7 @@ #include <linux/bitops.h> #include <linux/perf_event.h> #include <linux/ratelimit.h> +#include <linux/bitops.h> #include <asm/fpumacro.h> enum direction { @@ -373,16 +374,11 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) } } -static char popc_helper[] = { -0, 1, 1, 2, 1, 2, 2, 3, -1, 2, 2, 3, 2, 3, 3, 4, -}; - int handle_popc(u32 insn, struct pt_regs *regs) { - u64 value; - int ret, i, rd = ((insn >> 25) & 0x1f); int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; + int ret, rd = ((insn >> 25) & 0x1f); + u64 value; perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); if (insn & 0x2000) { @@ -392,10 +388,7 @@ int handle_popc(u32 insn, struct pt_regs *regs) maybe_flush_windows(0, insn & 0x1f, rd, from_kernel); value = fetch_reg(insn & 0x1f, regs); } - for (ret = 0, i = 0; i < 16; i++) { - ret += popc_helper[value & 0xf]; - value >>= 4; - } + ret = hweight64(value); if (rd < 16) { if (rd) regs->u_regs[rd] = ret; |
