diff options
| -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 @@ | |||
| 22 | #include <linux/bitops.h> | 22 | #include <linux/bitops.h> |
| 23 | #include <linux/perf_event.h> | 23 | #include <linux/perf_event.h> |
| 24 | #include <linux/ratelimit.h> | 24 | #include <linux/ratelimit.h> |
| 25 | #include <linux/bitops.h> | ||
| 25 | #include <asm/fpumacro.h> | 26 | #include <asm/fpumacro.h> |
| 26 | 27 | ||
| 27 | enum direction { | 28 | enum direction { |
| @@ -373,16 +374,11 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) | |||
| 373 | } | 374 | } |
| 374 | } | 375 | } |
| 375 | 376 | ||
| 376 | static char popc_helper[] = { | ||
| 377 | 0, 1, 1, 2, 1, 2, 2, 3, | ||
| 378 | 1, 2, 2, 3, 2, 3, 3, 4, | ||
| 379 | }; | ||
| 380 | |||
| 381 | int handle_popc(u32 insn, struct pt_regs *regs) | 377 | int handle_popc(u32 insn, struct pt_regs *regs) |
| 382 | { | 378 | { |
| 383 | u64 value; | ||
| 384 | int ret, i, rd = ((insn >> 25) & 0x1f); | ||
| 385 | int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; | 379 | int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; |
| 380 | int ret, rd = ((insn >> 25) & 0x1f); | ||
| 381 | u64 value; | ||
| 386 | 382 | ||
| 387 | perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); | 383 | perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); |
| 388 | if (insn & 0x2000) { | 384 | if (insn & 0x2000) { |
| @@ -392,10 +388,7 @@ int handle_popc(u32 insn, struct pt_regs *regs) | |||
| 392 | maybe_flush_windows(0, insn & 0x1f, rd, from_kernel); | 388 | maybe_flush_windows(0, insn & 0x1f, rd, from_kernel); |
| 393 | value = fetch_reg(insn & 0x1f, regs); | 389 | value = fetch_reg(insn & 0x1f, regs); |
| 394 | } | 390 | } |
| 395 | for (ret = 0, i = 0; i < 16; i++) { | 391 | ret = hweight64(value); |
| 396 | ret += popc_helper[value & 0xf]; | ||
| 397 | value >>= 4; | ||
| 398 | } | ||
| 399 | if (rd < 16) { | 392 | if (rd < 16) { |
| 400 | if (rd) | 393 | if (rd) |
| 401 | regs->u_regs[rd] = ret; | 394 | regs->u_regs[rd] = ret; |
