OSDN Git Service

powerpc: Don't update CR0 in emulation of popcnt, prty, bpermd instructions
authorPaul Mackerras <paulus@ozlabs.org>
Wed, 30 Aug 2017 04:12:30 +0000 (14:12 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 1 Sep 2017 06:39:50 +0000 (16:39 +1000)
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>
arch/powerpc/lib/sstep.c

index 00dae7b..10eabd9 100644 (file)
@@ -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];