9 #ifndef TEMU_BITMANIP_H
10 #define TEMU_BITMANIP_H
25 static inline uint32_t
26 temu_swap32Half(uint32_t Word)
28 uint32_t Res = Word << 16 | Word >> 16;
37 static inline uint64_t
38 temu_swap64Word(uint64_t DWord)
40 uint64_t Res = DWord << 32 | DWord >> 32;
49 static inline uint16_t
50 temu_swap16(uint16_t HWord)
53 uint16_t Res = __builtin_bswap16(HWord);
55 uint16_t Res = HWord << 8 | HWord >> 8;
65 static inline uint32_t
66 temu_swap32(uint32_t Word)
69 uint32_t Res = __builtin_bswap32(Word);
72 (((uint32_t)temu_swap16(Word)) << 16) | (uint32_t)temu_swap16(Word >> 16);
82 static inline uint64_t
83 temu_swap64(uint64_t DWord)
86 uint64_t Res = __builtin_bswap64(DWord);
88 uint64_t Res = (((uint64_t)temu_swap32(DWord)) << 32) |
89 (uint64_t)temu_swap32(DWord >> 32);
104 static inline uint32_t
105 temu_swapBigHost32Half(uint32_t Word)
107 return temu_swap32Half(Word);
120 static inline uint64_t
121 temu_swapBigHost64Word(uint64_t DWord)
123 return temu_swap64Word(DWord);
136 static inline uint32_t
137 temu_swapLittleHost32Half(uint32_t Word)
152 static inline uint64_t
153 temu_swapLittleHost64Word(uint64_t DWord)
168 static inline uint16_t
169 temu_swapBigHost16(uint16_t HWord)
171 return temu_swap16(HWord);
184 static inline uint32_t
185 temu_swapBigHost32(uint32_t Word)
187 return temu_swap32(Word);
200 static inline uint64_t
201 temu_swapBigHost64(uint64_t DWord)
203 return temu_swap64(DWord);
216 static inline uint16_t
217 temu_swapLittleHost16(uint16_t HWord)
232 static inline uint32_t
233 temu_swapLittleHost32(uint32_t Word)
248 static inline uint64_t
249 temu_swapLittleHost64(uint64_t DWord)
262 temu_ctz32(uint32_t Word)
266 int Res = __builtin_ctz(Word);
277 temu_clz32(uint32_t Word)
281 int Res = __builtin_clz(Word);
292 temu_popcount32(uint32_t Word)
294 int Res = __builtin_popcount(Word);
305 temu_parity32(uint32_t Word)
307 int Res = __builtin_parity(Word);
318 temu_ctz64(uint64_t Word)
322 int Res = __builtin_ctzl(Word);
333 temu_clz64(uint64_t Word)
337 int Res = __builtin_clzl(Word);
348 temu_popcount64(uint64_t Word)
350 int Res = __builtin_popcountl(Word);
361 temu_parity64(uint64_t Word)
363 int Res = __builtin_parityl(Word);
375 temu_isPow2_32(uint32_t Word)
378 return (Word & (Word - 1)) == 0;
390 temu_isPow2_64(uint64_t Word)
393 return (Word & (Word - 1)) == 0;
404 static inline uint32_t
405 temu_clearLeftmostBit32(uint32_t Word)
407 return Word & (Word - 1);
416 static inline uint64_t
417 temu_clearLeftmostBit64(uint64_t Word)
419 return Word & (Word - 1);
428 static inline uint32_t
429 temu_setRightmostZeroBit32(uint32_t Word)
431 return Word | (Word + 1);
440 static inline uint64_t
441 temu_setRightmostZeoroBit64(uint64_t Word)
443 return Word | (Word + 1);
452 static inline uint32_t
453 temu_isolateLeftmostBit32(uint32_t Word)
464 static inline uint64_t
465 temu_isolateLeftmostBit64(uint64_t Word)
477 static inline uint32_t
478 temu_isolateRightMostZeroBit32(uint32_t Word)
480 return (~Word) & (Word + 1);
490 static inline uint64_t
491 temu_isolateRightMostZeroBit64(uint64_t Word)
493 return (~Word) & (Word + 1);
502 static inline uint32_t
503 temu_identifyTrailingZeroes32(uint32_t Word)
505 return (~Word) & (Word - 1);
514 static inline uint64_t
515 temu_identifyTrailingZeroes64(uint64_t Word)
517 return (~Word) & (Word - 1);
526 static inline uint32_t
527 temu_identifyTrailingZeroesAndFirst32(uint32_t Word)
529 return Word ^ (Word - 1);
538 static inline uint64_t
539 temu_identifyTrailingZeroesAndFirst64(uint64_t Word)
541 return Word ^ (Word - 1);
550 static inline uint32_t
551 temu_propagateRightMostBit32(uint32_t Word)
553 return Word | (Word - 1);
562 static inline uint64_t
563 temu_propagateRightMostBit64(uint64_t Word)
565 return Word | (Word - 1);
574 static inline uint32_t
575 temu_clearRightMostBits32(uint32_t Word)
577 return ((Word | (Word - 1)) + 1) & Word;
586 static inline uint64_t
587 temu_clearRightMostBits64(uint64_t Word)
589 return ((Word | (Word - 1)) + 1) & Word;
599 static inline uint32_t
600 temu_roundDownToPow2_32(uint32_t Word, uint32_t Size)
602 uint32_t Res = Word & -Size;
613 static inline uint64_t
614 temu_roundDownToPow2_64(uint64_t Word, uint64_t Size)
616 uint64_t Res = Word & -Size;
627 static inline uint32_t
628 temu_roundUpToPow2_32(uint32_t Word, uint32_t Size)
630 uint32_t Res = (Word + (Size - 1)) & -Size;
641 static inline uint64_t
642 temu_roundUpToPow2_64(uint64_t Word, uint64_t Size)
644 uint64_t Res = (Word + (Size - 1)) & -Size;
657 temu_crossesBoundary32(uint32_t A, uint32_t L, uint32_t Size)
659 return -(A | -Size) < L;
671 temu_crossesBoundary64(uint64_t A, uint64_t L, uint64_t Size)
673 return -(A | -Size) < L;
682 static inline uint32_t
683 temu_roundUpNearestPow2_32(uint32_t Word)
685 uint32_t Res = 1 << (32 - temu_clz32(Word - 1));
695 static inline uint64_t
696 temu_roundUpNearestPow2_64(uint64_t Word)
698 uint64_t Res = 1 << (64 - temu_clz64(Word - 1));
708 static inline uint32_t
709 temu_roundDownNearestPow2_32(uint32_t Word)
711 uint32_t Res = 1 << (31 - temu_clz32(Word));
721 static inline uint64_t
722 temu_roundDownNearestPow2_64(uint64_t Word)
724 uint64_t Res = 1 << (63 - temu_clz64(Word));
738 static inline uint16_t
739 temu_bitreverse16(uint16_t Word)
741 uint32_t Res = (Word & 0x55555555) << 1 | (Word & 0xaaaaaaaa) >> 1;
742 Res = (Res & 0x33333333) << 2 | (Res & 0xcccccccc) >> 2;
743 Res = (Res & 0x0f0f0f0f) << 4 | (Res & 0xf0f0f0f0) >> 4;
744 Res = (Res & 0x00ff00ff) << 8 | (Res & 0xff00ff00) >> 8;
757 static inline uint32_t
758 temu_bitreverse32(uint32_t Word)
760 uint32_t Res = (Word & 0x55555555) << 1 | (Word & 0xaaaaaaaa) >> 1;
761 Res = (Res & 0x33333333) << 2 | (Res & 0xcccccccc) >> 2;
762 Res = (Res & 0x0f0f0f0f) << 4 | (Res & 0xf0f0f0f0) >> 4;
763 Res = (Res & 0x00ff00ff) << 8 | (Res & 0xff00ff00) >> 8;
764 Res = (Res & 0x0000ffff) << 16 | (Res & 0xffff0000) >> 16;
768 static inline uint64_t
769 temu_signExtend_8_64(uint8_t Val)
771 return (int64_t)(int8_t)Val;
774 static inline uint32_t
775 temu_signExtend_8_32(uint8_t Val)
777 return (int32_t)(int8_t)Val;
780 static inline uint16_t
781 temu_signExtend_8_16(uint8_t Val)
783 return (int16_t)(int8_t)Val;
796 static inline uint32_t
797 temu_signed32AddOverflows(uint32_t a, uint32_t b, uint32_t carry)
800 return ((((a + b + carry) ^ a) & ((a + b + carry) ^ b)) >> 31) & 1;
803 static inline uint32_t
804 temu_rotate32Left(uint32_t a, uint32_t steps)
806 return ((a << steps) | (a >> (32 - steps)));
809 static inline uint32_t
810 temu_rotate32Right(uint32_t a, uint32_t steps)
812 return ((a >> steps) | (a << (32 - steps)));