9 #ifndef TEMU_BITMANIP_H
10 #define TEMU_BITMANIP_H
17 #define __has_builtin(x) 0
29 static inline uint32_t
30 temu_swap32Half(uint32_t Word)
32 uint32_t Res = Word << 16 | Word >> 16;
41 static inline uint64_t
42 temu_swap64Word(uint64_t DWord)
44 uint64_t Res = DWord << 32 | DWord >> 32;
53 static inline uint16_t
54 temu_swap16(uint16_t HWord)
57 uint16_t Res = __builtin_bswap16(HWord);
59 uint16_t Res = HWord << 8 | HWord >> 8;
69 static inline uint32_t
70 temu_swap32(uint32_t Word)
73 uint32_t Res = __builtin_bswap32(Word);
76 (((uint32_t)temu_swap16(Word)) << 16) | (uint32_t)temu_swap16(Word >> 16);
86 static inline uint64_t
87 temu_swap64(uint64_t DWord)
90 uint64_t Res = __builtin_bswap64(DWord);
92 uint64_t Res = (((uint64_t)temu_swap32(DWord)) << 32) |
93 (uint64_t)temu_swap32(DWord >> 32);
108 static inline uint32_t
109 temu_swapBigHost32Half(uint32_t Word)
111 return temu_swap32Half(Word);
124 static inline uint64_t
125 temu_swapBigHost64Word(uint64_t DWord)
127 return temu_swap64Word(DWord);
140 static inline uint32_t
141 temu_swapLittleHost32Half(uint32_t Word)
156 static inline uint64_t
157 temu_swapLittleHost64Word(uint64_t DWord)
172 static inline uint16_t
173 temu_swapBigHost16(uint16_t HWord)
175 return temu_swap16(HWord);
188 static inline uint32_t
189 temu_swapBigHost32(uint32_t Word)
191 return temu_swap32(Word);
204 static inline uint64_t
205 temu_swapBigHost64(uint64_t DWord)
207 return temu_swap64(DWord);
220 static inline uint16_t
221 temu_swapLittleHost16(uint16_t HWord)
236 static inline uint32_t
237 temu_swapLittleHost32(uint32_t Word)
252 static inline uint64_t
253 temu_swapLittleHost64(uint64_t DWord)
266 temu_ctz32(uint32_t Word)
270 int Res = __builtin_ctz(Word);
281 temu_clz32(uint32_t Word)
285 int Res = __builtin_clz(Word);
296 temu_popcount32(uint32_t Word)
298 int Res = __builtin_popcount(Word);
309 temu_parity32(uint32_t Word)
311 int Res = __builtin_parity(Word);
322 temu_ctz64(uint64_t Word)
326 int Res = __builtin_ctzl(Word);
337 temu_clz64(uint64_t Word)
341 int Res = __builtin_clzl(Word);
354 temu_ctz16(uint16_t Word)
358 int Res = __builtin_ctz(Word);
369 temu_clz16(uint16_t Word)
373 int Res = __builtin_clz(Word) - 16;
384 temu_popcount64(uint64_t Word)
386 int Res = __builtin_popcountl(Word);
397 temu_parity64(uint64_t Word)
399 int Res = __builtin_parityl(Word);
411 temu_isPow2_32(uint32_t Word)
414 return (Word & (Word - 1)) == 0;
426 temu_isPow2_64(uint64_t Word)
429 return (Word & (Word - 1)) == 0;
440 static inline uint32_t
441 temu_clearLeftmostBit32(uint32_t Word)
443 return Word & (Word - 1);
452 static inline uint64_t
453 temu_clearLeftmostBit64(uint64_t Word)
455 return Word & (Word - 1);
464 static inline uint32_t
465 temu_setRightmostZeroBit32(uint32_t Word)
467 return Word | (Word + 1);
476 static inline uint64_t
477 temu_setRightmostZeoroBit64(uint64_t Word)
479 return Word | (Word + 1);
488 static inline uint32_t
489 temu_isolateLeftmostBit32(uint32_t Word)
500 static inline uint64_t
501 temu_isolateLeftmostBit64(uint64_t Word)
513 static inline uint32_t
514 temu_isolateRightMostZeroBit32(uint32_t Word)
516 return (~Word) & (Word + 1);
526 static inline uint64_t
527 temu_isolateRightMostZeroBit64(uint64_t Word)
529 return (~Word) & (Word + 1);
538 static inline uint32_t
539 temu_identifyTrailingZeroes32(uint32_t Word)
541 return (~Word) & (Word - 1);
550 static inline uint64_t
551 temu_identifyTrailingZeroes64(uint64_t Word)
553 return (~Word) & (Word - 1);
562 static inline uint32_t
563 temu_identifyTrailingZeroesAndFirst32(uint32_t Word)
565 return Word ^ (Word - 1);
574 static inline uint64_t
575 temu_identifyTrailingZeroesAndFirst64(uint64_t Word)
577 return Word ^ (Word - 1);
586 static inline uint32_t
587 temu_propagateRightMostBit32(uint32_t Word)
589 return Word | (Word - 1);
598 static inline uint64_t
599 temu_propagateRightMostBit64(uint64_t Word)
601 return Word | (Word - 1);
610 static inline uint32_t
611 temu_clearRightMostBits32(uint32_t Word)
613 return ((Word | (Word - 1)) + 1) & Word;
622 static inline uint64_t
623 temu_clearRightMostBits64(uint64_t Word)
625 return ((Word | (Word - 1)) + 1) & Word;
635 static inline uint32_t
636 temu_roundDownToPow2_32(uint32_t Word, uint32_t Size)
638 uint32_t Res = Word & -Size;
649 static inline uint64_t
650 temu_roundDownToPow2_64(uint64_t Word, uint64_t Size)
652 uint64_t Res = Word & -Size;
663 static inline uint32_t
664 temu_roundUpToPow2_32(uint32_t Word, uint32_t Size)
666 uint32_t Res = (Word + (Size - 1)) & -Size;
677 static inline uint64_t
678 temu_roundUpToPow2_64(uint64_t Word, uint64_t Size)
680 uint64_t Res = (Word + (Size - 1)) & -Size;
693 temu_crossesBoundary32(uint32_t A, uint32_t L, uint32_t Size)
695 return -(A | -Size) < L;
707 temu_crossesBoundary64(uint64_t A, uint64_t L, uint64_t Size)
709 return -(A | -Size) < L;
718 static inline uint32_t
719 temu_roundUpNearestPow2_32(uint32_t Word)
721 uint32_t Res = 1 << (32 - temu_clz32(Word - 1));
731 static inline uint64_t
732 temu_roundUpNearestPow2_64(uint64_t Word)
734 uint64_t Res = UINT64_C(1) << (64 - temu_clz64(Word - 1));
744 static inline uint32_t
745 temu_roundDownNearestPow2_32(uint32_t Word)
747 uint32_t Res = 1 << (31 - temu_clz32(Word));
757 static inline uint64_t
758 temu_roundDownNearestPow2_64(uint64_t Word)
760 uint64_t Res = UINT64_C(1) << (63 - temu_clz64(Word));
774 static inline uint16_t
775 temu_bitreverse16(uint16_t Word)
778 return __builtin_bitreverse16(Word);
780 uint32_t Res = (Word & 0x55555555) << 1 | (Word & 0xaaaaaaaa) >> 1;
781 Res = (Res & 0x33333333) << 2 | (Res & 0xcccccccc) >> 2;
782 Res = (Res & 0x0f0f0f0f) << 4 | (Res & 0xf0f0f0f0) >> 4;
783 Res = (Res & 0x00ff00ff) << 8 | (Res & 0xff00ff00) >> 8;
797 static inline uint32_t
798 temu_bitreverse32(uint32_t Word)
801 return __builtin_bitreverse32(Word);
803 uint32_t Res = (Word & 0x55555555) << 1 | (Word & 0xaaaaaaaa) >> 1;
804 Res = (Res & 0x33333333) << 2 | (Res & 0xcccccccc) >> 2;
805 Res = (Res & 0x0f0f0f0f) << 4 | (Res & 0xf0f0f0f0) >> 4;
806 Res = (Res & 0x00ff00ff) << 8 | (Res & 0xff00ff00) >> 8;
807 Res = (Res & 0x0000ffff) << 16 | (Res & 0xffff0000) >> 16;
812 static inline uint64_t
813 temu_bitreverse64(uint64_t DWord)
816 return __builtin_bitreverse64(DWord);
818 uint64_t reversed = (uint64_t)temu_bitreverse32(DWord >> 32) |
819 ((uint64_t)temu_bitreverse32(DWord) << 32);
824 static inline uint64_t
825 temu_signExtend_8_64(uint8_t Val)
827 return (int64_t)(int8_t)Val;
830 static inline uint32_t
831 temu_signExtend_8_32(uint8_t Val)
833 return (int32_t)(int8_t)Val;
836 static inline uint16_t
837 temu_signExtend_8_16(uint8_t Val)
839 return (int16_t)(int8_t)Val;
851 static inline uint32_t
852 temu_signed32AddOverflows(uint32_t a, uint32_t b, uint32_t carry)
855 return ((((a + b + carry) ^ a) & ((a + b + carry) ^ b)) >> 31) & 1;
858 static inline uint32_t
859 temu_rotate32Left(uint32_t a, uint32_t steps)
862 return __builtin_rotateleft32(a, steps);
864 return ((a << steps) | (a >> (32 - steps)));
868 static inline uint32_t
869 temu_rotate32Right(uint32_t a, uint32_t steps)
872 return __builtin_rotateright32(a, steps);
874 return ((a >> steps) | (a << (32 - steps)));