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