bug in arch/ppc/kernel/misc.S: __ashrdi3?

Benjamin Herrenschmidt benh at kernel.crashing.org
Sun Jul 17 03:39:47 EST 2005


On Fri, 2005-07-15 at 18:01 +0200, Frank van Maarseveen wrote:
> I don't really grok the code but an operand seems to be missing and the
> assembler makes something out of it I don't trust:
> 
> _GLOBAL(__ashrdi3)
> 	...
> 	rlwinm  r8,r7,0,32      # t3 = (count < 32) ? 32 : 0

This is equivalent to r8 = r7 & 32. It will definitely not do what the
comment says though. If (count < 64), however, it will do something
like r8 = (r7 < 32) ? 0 : 32. Paul, maybe we should dbl check what's
going in there ?

>    0:   54 e8 06 b4     rlwinm  r8,r7,0,26,26

This is the same.

The assembler, when provided with only one argument after the shift
count, will generate ME and MB to represent the mask whose value is
given in argument. (If you give an argument which doesn't contain a
single contiguous range of 1 bits, I suppose it will error out).

Ben.





More information about the Linuxppc-dev mailing list