9 #ifndef TEMU_BITMANIP_H
10 #define TEMU_BITMANIP_H
19 static inline uint32_t
20 temu_swap32Half(uint32_t Word)
22 uint32_t Res = Word << 16 | Word >> 16;
27 static inline uint64_t
28 temu_swap64Word(uint64_t DWord)
30 uint64_t Res = DWord << 32 | DWord >> 32;
36 static inline uint16_t
37 temu_swap16(uint16_t HWord)
40 uint16_t Res = __builtin_bswap16(HWord);
42 uint16_t Res = HWord << 8 | HWord >> 8;
48 static inline uint32_t
49 temu_swap32(uint32_t Word)
52 uint32_t Res = __builtin_bswap32(Word);
54 uint32_t Res = (((uint32_t)temu_swap16(Word)) << 16)
55 | (uint32_t)temu_swap16(Word >> 16);
61 static inline uint64_t
62 temu_swap64(uint64_t DWord)
65 uint64_t Res = __builtin_bswap64(DWord);
67 uint64_t Res = (((uint64_t)temu_swap32(DWord)) << 32)
68 | (uint64_t)temu_swap32(DWord >> 32);
79 static inline uint32_t
80 temu_swapBigHost32Half(uint32_t Word)
82 return temu_swap32Half(Word);
86 static inline uint64_t
87 temu_swapBigHost64Word(uint64_t DWord)
89 return temu_swap64Word(DWord);
93 static inline uint32_t
94 temu_swapLittleHost32Half(uint32_t Word)
100 static inline uint64_t
101 temu_swapLittleHost64Word(uint64_t DWord)
107 static inline uint16_t
108 temu_swapBigHost16(uint16_t HWord)
110 return temu_swap16(HWord);
113 static inline uint32_t
114 temu_swapBigHost32(uint32_t Word)
116 return temu_swap32(Word);
119 static inline uint64_t
120 temu_swapBigHost64(uint64_t DWord)
122 return temu_swap64(DWord);
125 static inline uint16_t
126 temu_swapLittleHost16(uint16_t HWord)
131 static inline uint32_t
132 temu_swapLittleHost32(uint32_t Word)
137 static inline uint64_t
138 temu_swapLittleHost64(uint64_t DWord)
147 temu_ctz32(uint32_t Word)
149 if (Word == 0)
return 32;
150 int Res = __builtin_ctz(Word);
156 temu_clz32(uint32_t Word)
158 if (Word == 0)
return 32;
159 int Res = __builtin_clz(Word);
165 temu_popcount32(uint32_t Word)
167 int Res = __builtin_popcount(Word);
173 temu_parity32(uint32_t Word)
175 int Res = __builtin_parity(Word);
182 temu_ctz64(uint64_t Word)
184 if (Word == 0)
return 64;
185 int Res = __builtin_ctzl(Word);
191 temu_clz64(uint64_t Word)
193 if (Word == 0)
return 64;
194 int Res = __builtin_clzl(Word);
200 temu_popcount64(uint64_t Word)
202 int Res = __builtin_popcountl(Word);
208 temu_parity64(uint64_t Word)
210 int Res = __builtin_parityl(Word);
217 temu_isPow2_32(uint32_t Word)
220 return (Word & (Word - 1)) == 0;
228 temu_isPow2_64(uint64_t Word)
231 return (Word & (Word - 1)) == 0;
237 static inline uint32_t
238 temu_clearLeftmostBit32(uint32_t Word)
240 return Word & (Word - 1);
243 static inline uint64_t
244 temu_clearLeftmostBit64(uint64_t Word)
246 return Word & (Word - 1);
250 static inline uint32_t
251 temu_setRightmostZeroBit32(uint32_t Word)
253 return Word | (Word + 1);
256 static inline uint64_t
257 temu_setRightmostZeoroBit64(uint64_t Word)
259 return Word | (Word + 1);
263 static inline uint32_t
264 temu_isolateLeftmostBit32(uint32_t Word)
269 static inline uint64_t
270 temu_isolateLeftmostBit64(uint64_t Word)
277 static inline uint32_t
278 temu_isolateRightMostZeroBit32(uint32_t Word)
280 return (~Word) & (Word+1);
282 static inline uint64_t
283 temu_isolateRightMostZeroBit64(uint64_t Word)
285 return (~Word) & (Word+1);
289 static inline uint32_t
290 temu_identifyTrailingZeroes32(uint32_t Word)
292 return (~Word) & (Word-1);
296 static inline uint64_t
297 temu_identifyTrailingZeroes64(uint64_t Word)
299 return (~Word) & (Word-1);
303 static inline uint32_t
304 temu_identifyTrailingZeroesAndFirst32(uint32_t Word)
306 return Word ^ (Word-1);
310 static inline uint64_t
311 temu_identifyTrailingZeroesAndFirst64(uint64_t Word)
313 return Word ^ (Word-1);
317 static inline uint32_t
318 temu_propagateRightMostBit32(uint32_t Word)
320 return Word | (Word-1);
323 static inline uint64_t
324 temu_propagateRightMostBit64(uint64_t Word)
326 return Word | (Word-1);
329 static inline uint32_t
330 temu_clearRightMostBits32(uint32_t Word)
332 return ((Word | (Word-1)) + 1) & Word;
335 static inline uint64_t
336 temu_clearRightMostBits64(uint64_t Word)
338 return ((Word | (Word-1)) + 1) & Word;