xref: /aosp_15_r20/external/mesa3d/src/nouveau/mme/mme_bitpack_helpers.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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