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 */