Skip to content

Commit

Permalink
[PATCH] FRV: Fix fls() to handle bit 31 being set correctly
Browse files Browse the repository at this point in the history
Fix FRV fls() to handle bit 31 being set correctly (it should return 32 not 0).

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
David Howells authored and Linus Torvalds committed Sep 26, 2006
1 parent af8c65b commit 92fc707
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions include/asm-frv/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,16 +161,29 @@ static inline int __test_bit(int nr, const volatile void * addr)
#include <asm-generic/bitops/__ffs.h>
#include <asm-generic/bitops/find.h>

/*
* fls: find last bit set.
/**
* fls - find last bit set
* @x: the word to search
*
* This is defined the same way as ffs:
* - return 32..1 to indicate bit 31..0 most significant bit set
* - return 0 to indicate no bits set
*/
#define fls(x) \
({ \
int bit; \
\
asm("scan %1,gr0,%0" : "=r"(bit) : "r"(x)); \
asm(" subcc %1,gr0,gr0,icc0 \n" \
" ckne icc0,cc4 \n" \
" cscan.p %1,gr0,%0 ,cc4,#1 \n" \
" csub %0,%0,%0 ,cc4,#0 \n" \
" csub %2,%0,%0 ,cc4,#1 \n" \
: "=&r"(bit) \
: "r"(x), "r"(32) \
: "icc0", "cc4" \
); \
\
bit ? 33 - bit : bit; \
bit; \
})

#include <asm-generic/bitops/fls64.h>
Expand Down

0 comments on commit 92fc707

Please sign in to comment.