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