Print this page
patch keith-feedback
5291 x86 {high,low}bit rely on undefined behavior

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/intel/ia32/ml/i86_subr.s
          +++ new/usr/src/uts/intel/ia32/ml/i86_subr.s
↓ open down ↓ 2793 lines elided ↑ open up ↑
2794 2794  int
2795 2795  lowbit(ulong_t i)
2796 2796  { return (0); }
2797 2797  
2798 2798  #else   /* __lint */
2799 2799  
2800 2800  #if defined(__amd64)
2801 2801  
2802 2802          ENTRY(lowbit)
2803 2803          movl    $-1, %eax
2804      -        bsfq    %rdi, %rax
     2804 +        bsfq    %rdi, %rdi
     2805 +        cmovnz  %edi, %eax
2805 2806          incl    %eax
2806 2807          ret
2807 2808          SET_SIZE(lowbit)
2808 2809  
2809 2810  #elif defined(__i386)
2810 2811  
2811 2812          ENTRY(lowbit)
2812      -        movl    $-1, %eax
2813 2813          bsfl    4(%esp), %eax
     2814 +        jz      0f
2814 2815          incl    %eax
2815 2816          ret
     2817 +0:
     2818 +        xorl    %eax, %eax
     2819 +        ret
2816 2820          SET_SIZE(lowbit)
2817 2821  
2818 2822  #endif  /* __i386 */
2819 2823  #endif  /* __lint */
2820 2824  
2821 2825  #if defined(__lint)
2822 2826  
2823 2827  /*ARGSUSED*/
2824 2828  int
2825 2829  highbit(ulong_t i)
2826 2830  { return (0); }
2827 2831  
     2832 +/*ARGSUSED*/
     2833 +int
     2834 +highbit64(uint64_t i)
     2835 +{ return (0); }
     2836 +
2828 2837  #else   /* __lint */
2829 2838  
2830 2839  #if defined(__amd64)
2831 2840  
2832 2841          ENTRY(highbit)
     2842 +        ALTENTRY(highbit64)
2833 2843          movl    $-1, %eax
2834      -        bsrq    %rdi, %rax
     2844 +        bsrq    %rdi, %rdi
     2845 +        cmovnz  %edi, %eax
2835 2846          incl    %eax
2836 2847          ret
     2848 +        SET_SIZE(highbit64)
2837 2849          SET_SIZE(highbit)
2838 2850  
2839 2851  #elif defined(__i386)
2840 2852  
2841 2853          ENTRY(highbit)
2842      -        movl    $-1, %eax
2843 2854          bsrl    4(%esp), %eax
     2855 +        jz      0f
2844 2856          incl    %eax
2845 2857          ret
     2858 +0:
     2859 +        xorl    %eax, %eax
     2860 +        ret    
2846 2861          SET_SIZE(highbit)
2847 2862  
2848      -#endif  /* __i386 */
2849      -#endif  /* __lint */
2850      -
2851      -#if defined(__lint)
2852      -
2853      -/*ARGSUSED*/
2854      -int
2855      -highbit64(uint64_t i)
2856      -{ return (0); }
2857      -
2858      -#else   /* __lint */
2859      -
2860      -#if defined(__amd64)
2861      -
2862      -        ENTRY(highbit64)
2863      -        movl    $-1, %eax
2864      -        bsrq    %rdi, %rax
2865      -        incl    %eax
2866      -        ret
2867      -        SET_SIZE(highbit64)
2868      -
2869      -#elif defined(__i386)
2870      -
2871 2863          ENTRY(highbit64)
2872 2864          bsrl    8(%esp), %eax
2873      -        jz      .lowbit
2874      -        addl    $32, %eax
2875      -        jmp     .done
2876      -
2877      -.lowbit:
2878      -        movl    $-1, %eax
2879      -        bsrl    4(%esp), %eax
2880      -.done:
2881      -        incl    %eax
     2865 +        jz      highbit
     2866 +        addl    $33, %eax
2882 2867          ret
2883 2868          SET_SIZE(highbit64)
2884 2869  
2885 2870  #endif  /* __i386 */
2886 2871  #endif  /* __lint */
2887 2872  
2888 2873  #if defined(__lint)
2889 2874  
2890 2875  /*ARGSUSED*/
2891 2876  uint64_t
↓ open down ↓ 1548 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX