summaryrefslogtreecommitdiff
path: root/arch/powerpc/lib
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@ozlabs.org>2017-08-30 14:12:30 +1000
committerMichael Ellerman <mpe@ellerman.id.au>2017-09-01 16:39:50 +1000
commit5762e08344bd7c5bfc41030f74c4ab6ce6e461d0 (patch)
tree98eb258e2e8b09cc84932ffd7b65cd3c87bf37ba /arch/powerpc/lib
parentf1bbb99f41e06d5ba93ea8eafacd96a7a71d0c7d (diff)
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')
-rw-r--r--arch/powerpc/lib/sstep.c12
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];