@@ -42,16 +42,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4242
4343#if defined(DAEMON_USE_COMPILER_INTRINSICS ) && defined(__GNUC__ )
4444
45+ inline uint32 FindLSB ( const uint8 value ) {
46+ return value ? __builtin_ctz ( value ) : 8 ;
47+ }
48+
49+ inline uint32 FindLSB ( const uint16 value ) {
50+ return value ? __builtin_ctz ( value ) : 16 ;
51+ }
52+
4553 inline uint32 FindLSB ( const uint32 value ) {
46- return value ? __builtin_ctzl ( value ) : 32 ;
54+ return value ? __builtin_ctzl ( value ) : 32 ;
4755 }
4856
4957 inline uint32 FindLSB ( const uint64 value ) {
5058 return value ? __builtin_ctzll ( value ) : 64 ;
5159 }
5260
61+ inline uint32 FindMSB ( const uint8 value ) {
62+ return value ? __builtin_clzl ( value ) : 8 ;
63+ }
64+
65+ inline uint32 FindMSB ( const uint16 value ) {
66+ return value ? __builtin_clzl ( value ) : 16 ;
67+ }
68+
5369 inline uint32 FindMSB ( const uint32 value ) {
54- return value ? __builtin_clzl ( value ) : 32 ;
70+ return value ? __builtin_clzl ( value ) : 32 ;
5571 }
5672
5773 inline uint32 FindMSB ( const uint64 value ) {
@@ -84,7 +100,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
84100
85101#elif defined(DAEMON_USE_COMPILER_INTRINSICS ) && defined(_MSC_VER )
86102
87- inline uint32 FindLSB ( const uint8 value ) {
103+ inline uint32 FindLSB ( const uint8 value ) {
88104 unsigned long index ;
89105 const bool nonZero = _BitScanForward ( & index , value );
90106 return nonZero ? index : 8 ;
@@ -108,7 +124,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
108124 return nonZero ? index : 64 ;
109125 }
110126
111- inline uint32 FindMSB ( const uint8 value ) {
127+ inline uint32 FindMSB ( const uint8 value ) {
112128 unsigned long index ;
113129 const bool nonZero = _BitScanReverse ( & index , value );
114130 return nonZero ? index : 8 ;
@@ -160,32 +176,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
160176
161177// Set a single bit to 1
162178
163- [[nodiscard ]] inline uint8 SetBit ( const uint8 value , const uint32 bit ) {
164- return value | ( 1u << bit );
179+ [[nodiscard ]] inline uint8 SetBit ( const uint8 value , const uint32 bit ) {
180+ return value | ( 1u << bit );
165181}
166182
167183[[nodiscard ]] inline uint16 SetBit ( const uint16 value , const uint32 bit ) {
168- return value | ( 1u << bit );
184+ return value | ( 1u << bit );
169185}
170186
171187[[nodiscard ]] inline uint32 SetBit ( const uint32 value , const uint32 bit ) {
172- return value | ( 1u << bit );
188+ return value | ( 1u << bit );
173189}
174190
175191[[nodiscard ]] inline uint64 SetBit ( const uint64 value , const uint32 bit ) {
176192 return value | ( 1ull << bit );
177193}
178194
179- inline void SetBit ( uint8 * value , const uint32 bit ) {
180- * value |= ( 1u << bit );
195+ inline void SetBit ( uint8 * value , const uint32 bit ) {
196+ * value |= ( 1u << bit );
181197}
182198
183199inline void SetBit ( uint16 * value , const uint32 bit ) {
184- * value |= ( 1u << bit );
200+ * value |= ( 1u << bit );
185201}
186202
187203inline void SetBit ( uint32 * value , const uint32 bit ) {
188- * value |= ( 1u << bit );
204+ * value |= ( 1u << bit );
189205}
190206
191207inline void SetBit ( uint64 * value , const uint32 bit ) {
@@ -195,7 +211,7 @@ inline void SetBit( uint64* value, const uint32 bit ) {
195211// Return a uint with only bits in range [start, start + count) set to 1
196212
197213[[nodiscard ]] inline uint8 BitMask8 ( const uint32 start , const uint32 count ) {
198- return ( UINT8_MAX >> ( 8 - count ) ) << start ;
214+ return ( UINT8_MAX >> ( 8 - count ) ) << start ;
199215}
200216
201217[[nodiscard ]] inline uint16 BitMask16 ( const uint32 start , const uint32 count ) {
@@ -212,7 +228,7 @@ inline void SetBit( uint64* value, const uint32 bit ) {
212228
213229// Set bits in range [start, start + count) to 1
214230
215- [[nodiscard ]] inline uint8 SetBits ( const uint8 value , const uint32 start , const uint32 count ) {
231+ [[nodiscard ]] inline uint8 SetBits ( const uint8 value , const uint32 start , const uint32 count ) {
216232 return value | BitMask8 ( start , count );
217233}
218234
@@ -228,7 +244,7 @@ inline void SetBit( uint64* value, const uint32 bit ) {
228244 return value | BitMask64 ( start , count );
229245}
230246
231- inline void SetBits ( uint8 * value , const uint32 start , const uint32 count ) {
247+ inline void SetBits ( uint8 * value , const uint32 start , const uint32 count ) {
232248 * value |= BitMask8 ( start , count );
233249}
234250
@@ -246,9 +262,9 @@ inline void SetBits( uint64* value, const uint32 start, const uint32 count ) {
246262
247263// Set bits in range [start, start + count) to a given value
248264
249- [[nodiscard ]] inline uint8 SetBits ( const uint8 value , const uint8 bits , const uint32 start , const uint32 count ) {
265+ [[nodiscard ]] inline uint8 SetBits ( const uint8 value , const uint8 bits , const uint32 start , const uint32 count ) {
250266 return ( value & ~BitMask8 ( start , count ) )
251- | ( ( bits & BitMask8 ( 0 , count ) ) << start );
267+ | ( ( bits & BitMask8 ( 0 , count ) ) << start );
252268}
253269
254270[[nodiscard ]] inline uint16 SetBits ( const uint16 value , const uint16 bits , const uint32 start , const uint32 count ) {
@@ -266,7 +282,7 @@ inline void SetBits( uint64* value, const uint32 start, const uint32 count ) {
266282 | ( ( bits & BitMask64 ( 0 , count ) ) << start );
267283}
268284
269- inline void SetBits ( uint8 * value , const uint8 bits , const uint32 start , const uint32 count ) {
285+ inline void SetBits ( uint8 * value , const uint8 bits , const uint32 start , const uint32 count ) {
270286 * value = SetBits ( * value , bits , start , count );
271287}
272288
@@ -284,32 +300,32 @@ inline void SetBits( uint64* value, const uint64 bits, const uint32 start, const
284300
285301// Set a single bit to 0
286302
287- [[nodiscard ]] inline uint8 UnSetBit ( const uint8 value , const uint32 bit ) {
288- return value & ~( 1u << bit );
303+ [[nodiscard ]] inline uint8 UnSetBit ( const uint8 value , const uint32 bit ) {
304+ return value & ~( 1u << bit );
289305}
290306
291307[[nodiscard ]] inline uint16 UnSetBit ( const uint16 value , const uint32 bit ) {
292- return value & ~( 1u << bit );
308+ return value & ~( 1u << bit );
293309}
294310
295311[[nodiscard ]] inline uint32 UnSetBit ( const uint32 value , const uint32 bit ) {
296- return value & ~( 1u << bit );
312+ return value & ~( 1u << bit );
297313}
298314
299315[[nodiscard ]] inline uint64 UnSetBit ( const uint64 value , const uint32 bit ) {
300316 return value & ~( 1ull << bit );
301317}
302318
303- inline void UnSetBit ( uint8 * value , const uint32 bit ) {
304- * value &= ~( 1u << bit );
319+ inline void UnSetBit ( uint8 * value , const uint32 bit ) {
320+ * value &= ~( 1u << bit );
305321}
306322
307323inline void UnSetBit ( uint16 * value , const uint32 bit ) {
308- * value &= ~( 1u << bit );
324+ * value &= ~( 1u << bit );
309325}
310326
311327inline void UnSetBit ( uint32 * value , const uint32 bit ) {
312- * value &= ~( 1u << bit );
328+ * value &= ~( 1u << bit );
313329}
314330
315331inline void UnSetBit ( uint64 * value , const uint32 bit ) {
@@ -318,8 +334,8 @@ inline void UnSetBit( uint64* value, const uint32 bit ) {
318334
319335// Return bits in range [start, start + count) in the lowest bits
320336
321- [[nodiscard ]] inline uint8 GetBits ( const uint8 value , const uint32 start , const uint32 count ) {
322- return ( value >> start ) & BitMask8 ( 0 , count );
337+ [[nodiscard ]] inline uint8 GetBits ( const uint8 value , const uint32 start , const uint32 count ) {
338+ return ( value >> start ) & BitMask8 ( 0 , count );
323339}
324340
325341[[nodiscard ]] inline uint16 GetBits ( const uint16 value , const uint32 start , const uint32 count ) {
@@ -334,7 +350,7 @@ inline void UnSetBit( uint64* value, const uint32 bit ) {
334350 return ( value >> start ) & BitMask64 ( 0 , count );
335351}
336352
337- inline int CompareBit ( const uint8 lhs , const uint8 rhs , const uint32 bit ) {
353+ inline int CompareBit ( const uint8 lhs , const uint8 rhs , const uint32 bit ) {
338354 const uint8 lhsBit = lhs & ( 1u << bit );
339355 const uint8 rhsBit = rhs & ( 1u << bit );
340356 return lhsBit < rhsBit ? -1 : ( lhsBit > rhsBit ? 1 : 0 );
@@ -358,24 +374,24 @@ inline int CompareBit( const uint64 lhs, const uint64 rhs, const uint32 bit ) {
358374 return lhsBit < rhsBit ? -1 : ( lhsBit > rhsBit ? 1 : 0 );
359375}
360376
361- inline const bool BitSet ( const uint8 value , const uint32 bit ) {
362- return value & ( 1u << bit );
377+ inline const bool BitSet ( const uint8 value , const uint32 bit ) {
378+ return value & ( 1u << bit );
363379}
364380
365381inline const bool BitSet ( const uint16 value , const uint32 bit ) {
366- return value & ( 1u << bit );
382+ return value & ( 1u << bit );
367383}
368384
369385inline const bool BitSet ( const uint32 value , const uint32 bit ) {
370- return value & ( 1u << bit );
386+ return value & ( 1u << bit );
371387}
372388
373389inline const bool BitSet ( const uint64 value , const uint32 bit ) {
374390 return value & ( 1ull << bit );
375391}
376392
377- inline uint32 FindLZeroBit ( uint8 value ) {
378- return FindLSB ( ( uint8 ) ~value );
393+ inline uint32 FindLZeroBit ( uint8 value ) {
394+ return FindLSB ( ( uint8 ) ~value );
379395}
380396
381397inline uint32 FindLZeroBit ( uint16 value ) {
0 commit comments