Print this page
patch keith-feedback
5291 x86 {high,low}bit rely on undefined behavior
@@ -2799,22 +2799,26 @@
#if defined(__amd64)
ENTRY(lowbit)
movl $-1, %eax
- bsfq %rdi, %rax
+ bsfq %rdi, %rdi
+ cmovnz %edi, %eax
incl %eax
ret
SET_SIZE(lowbit)
#elif defined(__i386)
ENTRY(lowbit)
- movl $-1, %eax
bsfl 4(%esp), %eax
+ jz 0f
incl %eax
ret
+0:
+ xorl %eax, %eax
+ ret
SET_SIZE(lowbit)
#endif /* __i386 */
#endif /* __lint */
@@ -2823,64 +2827,45 @@
/*ARGSUSED*/
int
highbit(ulong_t i)
{ return (0); }
+/*ARGSUSED*/
+int
+highbit64(uint64_t i)
+{ return (0); }
+
#else /* __lint */
#if defined(__amd64)
ENTRY(highbit)
+ ALTENTRY(highbit64)
movl $-1, %eax
- bsrq %rdi, %rax
+ bsrq %rdi, %rdi
+ cmovnz %edi, %eax
incl %eax
ret
+ SET_SIZE(highbit64)
SET_SIZE(highbit)
#elif defined(__i386)
ENTRY(highbit)
- movl $-1, %eax
bsrl 4(%esp), %eax
+ jz 0f
incl %eax
ret
- SET_SIZE(highbit)
-
-#endif /* __i386 */
-#endif /* __lint */
-
-#if defined(__lint)
-
-/*ARGSUSED*/
-int
-highbit64(uint64_t i)
-{ return (0); }
-
-#else /* __lint */
-
-#if defined(__amd64)
-
- ENTRY(highbit64)
- movl $-1, %eax
- bsrq %rdi, %rax
- incl %eax
+0:
+ xorl %eax, %eax
ret
- SET_SIZE(highbit64)
-
-#elif defined(__i386)
+ SET_SIZE(highbit)
ENTRY(highbit64)
bsrl 8(%esp), %eax
- jz .lowbit
- addl $32, %eax
- jmp .done
-
-.lowbit:
- movl $-1, %eax
- bsrl 4(%esp), %eax
-.done:
- incl %eax
+ jz highbit
+ addl $33, %eax
ret
SET_SIZE(highbit64)
#endif /* __i386 */
#endif /* __lint */