1 /*
2 * Copyright © 2024 Collabora, Ltd.
3 * SPDX-License-Identifier: MIT
4 */
5 #ifndef MME_BITPACK_HELPERS_H
6 #define MME_BITPACK_HELPERS_H
7
8 #include "util/bitpack_helpers.h"
9 #include "util/u_math.h"
10
11 static inline void
pack_uint(uint32_t * b,unsigned start,unsigned end,uint64_t data)12 pack_uint(uint32_t *b, unsigned start, unsigned end, uint64_t data)
13 {
14 assert(end >= start);
15
16 uint32_t dw = start / 32;
17 start -= dw * 32;
18 end -= dw * 32;
19 assert(end < 64);
20
21 uint64_t packed = util_bitpack_uint(data, start, end);
22
23 b[dw] |= packed;
24 if (end >= 32)
25 b[dw + 1] |= packed >> 32;
26 }
27
28 static inline void
pack_sint(uint32_t * b,unsigned start,unsigned end,int64_t data)29 pack_sint(uint32_t *b, unsigned start, unsigned end, int64_t data)
30 {
31 assert(end >= start);
32
33 uint32_t dw = start / 32;
34 start -= dw * 32;
35 end -= dw * 32;
36 assert(end < 64);
37
38 uint64_t packed = util_bitpack_sint(data, start, end);
39
40 b[dw] |= packed;
41 if (end >= 32)
42 b[dw + 1] |= packed >> 32;
43 }
44
45 static inline uint64_t
unpack_uint(const uint32_t * b,unsigned start,unsigned end)46 unpack_uint(const uint32_t *b, unsigned start, unsigned end)
47 {
48 assert(end >= start);
49
50 uint32_t dw = start / 32;
51 start -= dw * 32;
52 end -= dw * 32;
53 assert(end < 64);
54
55 uint64_t packed = b[dw];
56 if (end >= 32)
57 packed |= (uint64_t)b[dw + 1] << 32;
58
59 packed &= util_bitpack_ones(start, end);
60
61 return packed >> start;
62 }
63
64 static inline uint64_t
unpack_sint(const uint32_t * b,unsigned start,unsigned end)65 unpack_sint(const uint32_t *b, unsigned start, unsigned end)
66 {
67 unsigned bits = end - start + 1;
68 return util_sign_extend(unpack_uint(b, start, end), bits);
69 }
70
71 #endif /* MME_BITPACK_HELPERS_H */
72