lkml.org 
[lkml]   [2004]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [2.6.6-BK] x86_64 has buggy ffs() implementation
    Date
    Followup to:  <1084369416.16624.53.camel@imp.csi.cam.ac.uk>
    By author: Anton Altaparmakov <aia21@cam.ac.uk>
    In newsgroup: linux.dev.kernel
    >
    > Hi Andi, Andrew, Linus,
    >
    > x86_64 has incorrect include/asm-x86_64/bitops.h::ffs() implementation.
    > It uses "g" instead of "rm" in the insline assembled bsfl instruction.
    > (This was spotted by Yuri Per.)
    >
    > bsfl does not accept constant values but only memory ones. On i386 the
    > correct "rm" is used.
    >
    > This causes NTFS build to fail as gcc optimizes a variable into a
    > constant and ffs() then fails to assemble.
    >

    Of course, this is a good reason to do a __builtin_constant_p()
    wrapper that gcc can optimize:

    static __inline__ __attribute_const__ int ffs(int x)
    {
    if ( __builtin_constant_p(x) ) {
    unsigned int y = (unsigned int)x;
    if ( y >= 0x80000000 )
    return 32;
    else if ( y >= 0x40000000 )
    return 31;
    else if /* ... you get the idea ... */
    } else {
    __asm__("bsfl %1,%0\n\t"
    "cmovzl %2,%0"
    : "=r" (r) : "rm" (x), "r" (-1));
    return r+1;
    }
    }
    -hpa
    -
    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/

    \
     
     \ /
      Last update: 2005-03-22 14:03    [from the cache]
    ©2003-2011 Jasper Spaans