Print this page
5291 x86 {high,low}bit rely on undefined behavior

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/intel/asm/bitmap.h
          +++ new/usr/src/uts/intel/asm/bitmap.h
↓ open down ↓ 40 lines elided ↑ open up ↑
  41   41  #define __SUF   "q"
  42   42  #elif defined(__i386)
  43   43  #define __SUF   "l"
  44   44  #else
  45   45  #error "port me"
  46   46  #endif
  47   47  
  48   48  extern __GNU_INLINE int
  49   49  highbit(ulong_t i)
  50   50  {
  51      -        long value = -1l;
       51 +        long value;
       52 +        uint8_t zf;
  52   53  
  53   54          __asm__(
  54      -            "bsr" __SUF " %1,%0"
  55      -            : "+r" (value)
  56      -            : "r" (i)
       55 +            "bsr" __SUF " %2,%0;"
       56 +            "setz %1"
       57 +            : "=r" (value), "=q" (zf)
       58 +            : "mr" (i)
  57   59              : "cc");
  58   60  
  59      -        return ((int)(value + 1));
       61 +        return (zf ? 0 : (value + 1));
  60   62  }
  61   63  
  62   64  extern __GNU_INLINE int
  63   65  lowbit(ulong_t i)
  64   66  {
  65      -        long value = -1l;
       67 +        long value;
       68 +        uint8_t zf;
  66   69  
  67   70          __asm__(
  68      -            "bsf" __SUF " %1,%0"
  69      -            : "+r" (value)
  70      -            : "r" (i)
       71 +            "bsf" __SUF " %2,%0;"
       72 +            "setz %1"
       73 +            : "=r" (value), "=q" (zf)
       74 +            : "mr" (i)
  71   75              : "cc");
  72   76  
  73      -        return ((int)(value + 1));
       77 +        return (zf ? 0 : (value + 1));
  74   78  }
  75   79  
  76   80  extern __GNU_INLINE uint_t
  77   81  atomic_btr32(uint32_t *memory, uint_t bitnum)
  78   82  {
  79   83          uint8_t value;
  80   84  
  81   85          __asm__ __volatile__(
  82   86              "lock;"
  83   87              "btrl %2,%0;"
↓ open down ↓ 17 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX