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) {