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