diff options
author | Paul Mackerras <paulus@ozlabs.org> | 2017-08-30 07:12:30 +0300 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2017-09-01 09:39:50 +0300 |
commit | 5762e08344bd7c5bfc41030f74c4ab6ce6e461d0 (patch) | |
tree | 98eb258e2e8b09cc84932ffd7b65cd3c87bf37ba /arch/powerpc/lib/sstep.c | |
parent | f1bbb99f41e06d5ba93ea8eafacd96a7a71d0c7d (diff) | |
download | linux-5762e08344bd7c5bfc41030f74c4ab6ce6e461d0.tar.xz |
powerpc: Don't update CR0 in emulation of popcnt, prty, bpermd instructions
The architecture shows the least-significant bit of the instruction
word as reserved for the popcnt[bwd], prty[wd] and bpermd
instructions, that is, these instructions never update CR0.
Therefore this changes the emulation of these instructions to
skip the CR0 update.
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/lib/sstep.c')
-rw-r--r-- | arch/powerpc/lib/sstep.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index 00dae7b7e785..10eabd9a255d 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c @@ -1469,7 +1469,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, case 122: /* popcntb */ do_popcnt(regs, op, regs->gpr[rd], 8); - goto logical_done; + goto logical_done_nocc; case 124: /* nor */ op->val = ~(regs->gpr[rd] | regs->gpr[rb]); @@ -1477,15 +1477,15 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, case 154: /* prtyw */ do_prty(regs, op, regs->gpr[rd], 32); - goto logical_done; + goto logical_done_nocc; case 186: /* prtyd */ do_prty(regs, op, regs->gpr[rd], 64); - goto logical_done; + goto logical_done_nocc; #ifdef CONFIG_PPC64 case 252: /* bpermd */ do_bpermd(regs, op, regs->gpr[rd], regs->gpr[rb]); - goto logical_done; + goto logical_done_nocc; #endif case 284: /* xor */ op->val = ~(regs->gpr[rd] ^ regs->gpr[rb]); @@ -1497,7 +1497,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, case 378: /* popcntw */ do_popcnt(regs, op, regs->gpr[rd], 32); - goto logical_done; + goto logical_done_nocc; case 412: /* orc */ op->val = regs->gpr[rd] | ~regs->gpr[rb]; @@ -1513,7 +1513,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, #ifdef CONFIG_PPC64 case 506: /* popcntd */ do_popcnt(regs, op, regs->gpr[rd], 64); - goto logical_done; + goto logical_done_nocc; #endif case 922: /* extsh */ op->val = (signed short) regs->gpr[rd]; |