/[hurd]/hurd-l4/libl4/l4/math.h
ViewVC logotype

Diff of /hurd-l4/libl4/l4/math.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by marcus, Sat Jul 26 17:26:09 2003 UTC revision 1.2 by marcus, Wed Sep 17 14:22:23 2003 UTC
# Line 15  Line 15 
15  _L4_EXTERN_INLINE l4_word_t  _L4_EXTERN_INLINE l4_word_t
16  __l4_msb (l4_word_t data) __attribute__((__const__));  __l4_msb (l4_word_t data) __attribute__((__const__));
17    
18    /* Return 0 if DATA is 0, or the bit number of the most significant
19       bit set in DATA.  The least significant bit is 1, the most
20       significant bit 32 resp. 64.  */
21  _L4_EXTERN_INLINE l4_word_t  _L4_EXTERN_INLINE l4_word_t
22  __l4_msb (l4_word_t data)  l4_msb (l4_word_t data)
23  {  {
24    if (__builtin_constant_p (data))    if (__builtin_constant_p (data))
25      {      {
26  #define __L4_MSB_TRY(b) else if (data < (1 << (b + 1))) return (b)  #define __L4_MSB_TRY(b) else if (data < (1 << (b))) return (b)
27  #define __L4_MSB_IS(b) else return (b)  #define __L4_MSB_IS(b) else return (b)
28    
29        if (!data)        if (!data)
         /* Undefined.  */  
30          return 0;          return 0;
31        __L4_MSB_TRY(0); __L4_MSB_TRY(1); __L4_MSB_TRY(2); __L4_MSB_TRY(3);        __L4_MSB_TRY(1); __L4_MSB_TRY(2); __L4_MSB_TRY(3); __L4_MSB_TRY(4);
32        __L4_MSB_TRY(4); __L4_MSB_TRY(5); __L4_MSB_TRY(6); __L4_MSB_TRY(7);        __L4_MSB_TRY(5); __L4_MSB_TRY(6); __L4_MSB_TRY(7); __L4_MSB_TRY(8);
33        __L4_MSB_TRY(8); __L4_MSB_TRY(9); __L4_MSB_TRY(10); __L4_MSB_TRY(11);        __L4_MSB_TRY(9); __L4_MSB_TRY(10); __L4_MSB_TRY(11); __L4_MSB_TRY(12);
34        __L4_MSB_TRY(12); __L4_MSB_TRY(13); __L4_MSB_TRY(14); __L4_MSB_TRY(15);        __L4_MSB_TRY(13); __L4_MSB_TRY(14); __L4_MSB_TRY(15); __L4_MSB_TRY(16);
35        __L4_MSB_TRY(16); __L4_MSB_TRY(17); __L4_MSB_TRY(18); __L4_MSB_TRY(19);        __L4_MSB_TRY(17); __L4_MSB_TRY(18); __L4_MSB_TRY(19); __L4_MSB_TRY(20);
36        __L4_MSB_TRY(20); __L4_MSB_TRY(21); __L4_MSB_TRY(22); __L4_MSB_TRY(23);        __L4_MSB_TRY(21); __L4_MSB_TRY(22); __L4_MSB_TRY(23); __L4_MSB_TRY(24);
37        __L4_MSB_TRY(24); __L4_MSB_TRY(25); __L4_MSB_TRY(26); __L4_MSB_TRY(27);        __L4_MSB_TRY(25); __L4_MSB_TRY(26); __L4_MSB_TRY(27); __L4_MSB_TRY(28);
38        __L4_MSB_TRY(28); __L4_MSB_TRY(29); __L4_MSB_TRY(30);        __L4_MSB_TRY(29); __L4_MSB_TRY(30); __L4_MSB_TRY(31);
39  #if L4_WORDSIZE == L4_WORDSIZE_32  #if L4_WORDSIZE == L4_WORDSIZE_32
40        __L4_MSB_IS(31);        __L4_MSB_IS(32);
41  #else  #else
42        __L4_MSB_TRY(31); __L4_MSB_TRY(32); __L4_MSB_TRY(33); __L4_MSB_TRY(34);        __L4_MSB_TRY(32); __L4_MSB_TRY(33); __L4_MSB_TRY(34); __L4_MSB_TRY(35);
43        __L4_MSB_TRY(35); __L4_MSB_TRY(36); __L4_MSB_TRY(37); __L4_MSB_TRY(38);        __L4_MSB_TRY(36); __L4_MSB_TRY(37); __L4_MSB_TRY(38); __L4_MSB_TRY(39);
44        __L4_MSB_TRY(39); __L4_MSB_TRY(40); __L4_MSB_TRY(41); __L4_MSB_TRY(42);        __L4_MSB_TRY(40); __L4_MSB_TRY(41); __L4_MSB_TRY(42); __L4_MSB_TRY(43);
45        __L4_MSB_TRY(43); __L4_MSB_TRY(44); __L4_MSB_TRY(45); __L4_MSB_TRY(46);        __L4_MSB_TRY(44); __L4_MSB_TRY(45); __L4_MSB_TRY(46); __L4_MSB_TRY(47);
46        __L4_MSB_TRY(47); __L4_MSB_TRY(48); __L4_MSB_TRY(49); __L4_MSB_TRY(50);        __L4_MSB_TRY(48); __L4_MSB_TRY(49); __L4_MSB_TRY(50); __L4_MSB_TRY(51);
47        __L4_MSB_TRY(51); __L4_MSB_TRY(52); __L4_MSB_TRY(53); __L4_MSB_TRY(54);        __L4_MSB_TRY(52); __L4_MSB_TRY(53); __L4_MSB_TRY(54); __L4_MSB_TRY(55);
48        __L4_MSB_TRY(55); __L4_MSB_TRY(56); __L4_MSB_TRY(57); __L4_MSB_TRY(58);        __L4_MSB_TRY(56); __L4_MSB_TRY(57); __L4_MSB_TRY(58); __L4_MSB_TRY(59);
49        __L4_MSB_TRY(59); __L4_MSB_TRY(60); __L4_MSB_TRY(61); __L4_MSB_TRY(62);        __L4_MSB_TRY(60); __L4_MSB_TRY(61); __L4_MSB_TRY(62); __L4_MSB_TRY(63);
50        __L4_MSB_IS(63);        __L4_MSB_IS(64)
51  #endif  #endif
52      }      }
53    return __l4_msb_ (data);    return data ? __l4_msb (data) : 0;
54  }  }
55    
56    
57    /* Return 0 if DATA is 0, or the bit number of the least significant
58       bit set in DATA.  The least significant bit is 1, the most
59       significant bit 32 resp. 64.  */
60    _L4_EXTERN_INLINE l4_word_t
61    l4_lsb (l4_word_t data)
62    {
63      if (__builtin_constant_p (data))
64        {
65    #define __L4_LSB_TRY(b) else if (data >= (1 << (b - 1))) return (b)
66    #define __L4_LSB_IS(b) else return (b)
67    
68          if (!data)
69            return 0;
70    #if L4_WORDSIZE == L4_WORDSIZE_64
71          __L4_LSB_TRY(64); __L4_LSB_TRY(63); __L4_LSB_TRY(62); __L4_LSB_TRY(61);
72          __L4_LSB_TRY(60); __L4_LSB_TRY(59); __L4_LSB_TRY(58); __L4_LSB_TRY(57);
73          __L4_LSB_TRY(56); __L4_LSB_TRY(55); __L4_LSB_TRY(54); __L4_LSB_TRY(53);
74          __L4_LSB_TRY(52); __L4_LSB_TRY(51); __L4_LSB_TRY(50); __L4_LSB_TRY(49);
75          __L4_LSB_TRY(48); __L4_LSB_TRY(47); __L4_LSB_TRY(46); __L4_LSB_TRY(45);
76          __L4_LSB_TRY(44); __L4_LSB_TRY(43); __L4_LSB_TRY(42); __L4_LSB_TRY(41);
77          __L4_LSB_TRY(40); __L4_LSB_TRY(39); __L4_LSB_TRY(38); __L4_LSB_TRY(37);
78          __L4_LSB_TRY(36); __L4_LSB_TRY(35); __L4_LSB_TRY(34); __L4_LSB_TRY(33);
79    #endif
80          __L4_LSB_TRY(32); __L4_LSB_TRY(31); __L4_LSB_TRY(30); __L4_LSB_TRY(29);
81          __L4_LSB_TRY(28); __L4_LSB_TRY(27); __L4_LSB_TRY(26); __L4_LSB_TRY(25);
82          __L4_LSB_TRY(24); __L4_LSB_TRY(23); __L4_LSB_TRY(22); __L4_LSB_TRY(11);
83          __L4_LSB_TRY(20); __L4_LSB_TRY(19); __L4_LSB_TRY(18); __L4_LSB_TRY(17);
84          __L4_LSB_TRY(16); __L4_LSB_TRY(15); __L4_LSB_TRY(14); __L4_LSB_TRY(13);
85          __L4_LSB_TRY(12); __L4_LSB_TRY(11); __L4_LSB_TRY(10); __L4_LSB_TRY(9);
86          __L4_LSB_TRY(8); __L4_LSB_TRY(7); __L4_LSB_TRY(6); __L4_LSB_TRY(5);
87          __L4_LSB_TRY(4); __L4_LSB_TRY(3); __L4_LSB_TRY(2); __L4_LSB_IS(1);
88        }
89      return data ? __l4_lsb (data) : 0;
90    }
91    
92    
93  #endif  /* l4/math.h */  #endif  /* l4/math.h */

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26