On 2017/10/10 06:45AM, Sandipan Das wrote: > According to the GCC documentation, the behaviour of __builtin_clz() > and __builtin_clzl() is undefined if the value of the input argument > is zero. Without handling this special case, these builtins have been > used for emulating the following instructions: > * Count Leading Zeros Word (cntlzw[.]) > * Count Leading Zeros Doubleword (cntlzd[.]) > > This fixes the emulated behaviour of these instructions by adding an > additional check for this special case. > > Fixes: 3cdfcbfd32b9d ("powerpc: Change analyse_instr so it doesn't modify > *regs") > Signed-off-by: Sandipan Das <sandi...@linux.vnet.ibm.com>
Reviewed-by: Naveen N. Rao <naveen.n....@linux.vnet.ibm.com> > --- > v2: Make zero-checking condition more compact. > Add details of original commit that is being fixed here. > --- > arch/powerpc/lib/sstep.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c > index 5118110c3983..8c3955e183d4 100644 > --- a/arch/powerpc/lib/sstep.c > +++ b/arch/powerpc/lib/sstep.c > @@ -1699,11 +1699,13 @@ int analyse_instr(struct instruction_op *op, const > struct pt_regs *regs, > * Logical instructions > */ > case 26: /* cntlzw */ > - op->val = __builtin_clz((unsigned int) regs->gpr[rd]); > + val = (unsigned int) regs->gpr[rd]; > + op->val = ( val ? __builtin_clz(val) : 32 ); > goto logical_done; > #ifdef __powerpc64__ > case 58: /* cntlzd */ > - op->val = __builtin_clzl(regs->gpr[rd]); > + val = regs->gpr[rd]; > + op->val = ( val ? __builtin_clzl(val) : 64 ); > goto logical_done; > #endif > case 28: /* and */ > -- > 2.13.6 >