Re: Kernel's X86 ffs() doesn't work on constants.

H. Peter Anvin (hpa@zytor.com)
28 Nov 2001 15:00:38 -0800


Followup to: <200111282239.fASMdMY82422@aslan.scsiguy.com>
By author: "Justin T. Gibbs" <gibbs@scsiguy.com>
In newsgroup: linux.dev.kernel
>
> If you attempt to call ffs(SOME_CONSTAT) in an x86 kernel under
> Linux, you get messages like this:
>
> {standard input}: Assembler messages:
> {standard input}:14864: Error: suffix or operands invalid for `bsf'
>
> I'm not enough of a GCC asm syntax guru to understand why the
> compiler/assembler doesn't handle this, but it is hightly anoying.
>
> "Why not just code in the constant bit offset?", you ask? If
> the constant the bit offset is based on is ever changed, I must
> recognize that the change occured and change the second constant.
> For constants that are maintained outside of my code, I'd rather
> code the dependency once and let the compiler ensure that the constants
> are in sync.
>

Try changing the "g" in the definition of ffs() (asm/bitops.h) to
"rm"; the "g" constrains incorrectly allows immediate operands.

-hpa

-- 
<hpa@transmeta.com> at work, <hpa@zytor.com> in private!
"Unix gives you enough rope to shoot yourself in the foot."
http://www.zytor.com/~hpa/puzzle.txt	<amsp@zytor.com>
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/