Print this page
5291 x86 {high,low}bit rely on undefined behavior
*** 46,78 ****
#endif
extern __GNU_INLINE int
highbit(ulong_t i)
{
! long value = -1l;
__asm__(
! "bsr" __SUF " %1,%0"
! : "+r" (value)
! : "r" (i)
: "cc");
! return ((int)(value + 1));
}
extern __GNU_INLINE int
lowbit(ulong_t i)
{
! long value = -1l;
__asm__(
! "bsf" __SUF " %1,%0"
! : "+r" (value)
! : "r" (i)
: "cc");
! return ((int)(value + 1));
}
extern __GNU_INLINE uint_t
atomic_btr32(uint32_t *memory, uint_t bitnum)
{
--- 46,82 ----
#endif
extern __GNU_INLINE int
highbit(ulong_t i)
{
! long value;
! uint8_t zf;
__asm__(
! "bsr" __SUF " %2,%0;"
! "setz %1"
! : "=r" (value), "=q" (zf)
! : "mr" (i)
: "cc");
! return (zf ? 0 : (value + 1));
}
extern __GNU_INLINE int
lowbit(ulong_t i)
{
! long value;
! uint8_t zf;
__asm__(
! "bsf" __SUF " %2,%0;"
! "setz %1"
! : "=r" (value), "=q" (zf)
! : "mr" (i)
: "cc");
! return (zf ? 0 : (value + 1));
}
extern __GNU_INLINE uint_t
atomic_btr32(uint32_t *memory, uint_t bitnum)
{