Skip to content

Commit 7ab181c

Browse files
committed
Bit: add gnu/clang FindLSB() and FindMSB() for uin8 and uint16, clean-up
1 parent 9100527 commit 7ab181c

1 file changed

Lines changed: 51 additions & 35 deletions

File tree

  • src/engine/renderer-vulkan/Math

src/engine/renderer-vulkan/Math/Bit.h

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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

183199
inline void SetBit( uint16* value, const uint32 bit ) {
184-
*value |= ( 1u << bit );
200+
*value |= ( 1u << bit );
185201
}
186202

187203
inline void SetBit( uint32* value, const uint32 bit ) {
188-
*value |= ( 1u << bit );
204+
*value |= ( 1u << bit );
189205
}
190206

191207
inline 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

307323
inline void UnSetBit( uint16* value, const uint32 bit ) {
308-
*value &= ~( 1u << bit );
324+
*value &= ~( 1u << bit );
309325
}
310326

311327
inline void UnSetBit( uint32* value, const uint32 bit ) {
312-
*value &= ~( 1u << bit );
328+
*value &= ~( 1u << bit );
313329
}
314330

315331
inline 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

365381
inline const bool BitSet( const uint16 value, const uint32 bit ) {
366-
return value & ( 1u << bit );
382+
return value & ( 1u << bit );
367383
}
368384

369385
inline const bool BitSet( const uint32 value, const uint32 bit ) {
370-
return value & ( 1u << bit );
386+
return value & ( 1u << bit );
371387
}
372388

373389
inline 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

381397
inline uint32 FindLZeroBit( uint16 value ) {

0 commit comments

Comments
 (0)