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