From 95435a788d3ca0fbdb01ee679b6beda6865ce394 Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Wed, 8 Jan 2025 12:04:15 +0100 Subject: [PATCH] pan/genxml: Switch unpack to use uint32_t Makes this match pack. Signed-off-by: Mary Guillemard Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/lib/genxml/gen_pack.py | 2 +- src/panfrost/lib/genxml/pan_pack_helpers.h | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/panfrost/lib/genxml/gen_pack.py b/src/panfrost/lib/genxml/gen_pack.py index f3c3cca2a2b..fa637487b14 100644 --- a/src/panfrost/lib/genxml/gen_pack.py +++ b/src/panfrost/lib/genxml/gen_pack.py @@ -654,7 +654,7 @@ class Parser(object): def emit_unpack_function(self, name, group): print("static inline void") - print("%s_unpack(const uint8_t * restrict cl,\n%sstruct %s * restrict values)\n{" % + print("%s_unpack(const uint32_t * restrict cl,\n%sstruct %s * restrict values)\n{" % (name.upper(), ' ' * (len(name) + 8), name)) group.emit_unpack_function() diff --git a/src/panfrost/lib/genxml/pan_pack_helpers.h b/src/panfrost/lib/genxml/pan_pack_helpers.h index 3cf802fa8ef..e6ef238eee9 100644 --- a/src/panfrost/lib/genxml/pan_pack_helpers.h +++ b/src/panfrost/lib/genxml/pan_pack_helpers.h @@ -30,21 +30,22 @@ __gen_padded(uint32_t v, uint32_t start, uint32_t end) } static inline uint64_t -__gen_unpack_uint(const uint8_t *restrict cl, uint32_t start, uint32_t end) +__gen_unpack_uint(const uint32_t *restrict cl, uint32_t start, uint32_t end) { uint64_t val = 0; const int width = end - start + 1; - const uint64_t mask = (width == 64 ? ~0 : (1ull << width) - 1); + const uint64_t mask = + (width == 64) ? ~((uint64_t)0) : ((uint64_t)1 << width) - 1; - for (uint32_t byte = start / 8; byte <= end / 8; byte++) { - val |= ((uint64_t)cl[byte]) << ((byte - start / 8) * 8); + for (unsigned word = start / 32; word < (end / 32) + 1; word++) { + val |= ((uint64_t)cl[word]) << ((word - start / 32) * 32); } - return (val >> (start % 8)) & mask; + return (val >> (start % 32)) & mask; } static inline uint64_t -__gen_unpack_sint(const uint8_t *restrict cl, uint32_t start, uint32_t end) +__gen_unpack_sint(const uint32_t *restrict cl, uint32_t start, uint32_t end) { int size = end - start + 1; int64_t val = __gen_unpack_uint(cl, start, end); @@ -53,7 +54,7 @@ __gen_unpack_sint(const uint8_t *restrict cl, uint32_t start, uint32_t end) } static inline float -__gen_unpack_ulod(const uint8_t *restrict cl, uint32_t start, uint32_t end) +__gen_unpack_ulod(const uint32_t *restrict cl, uint32_t start, uint32_t end) { uint32_t u = __gen_unpack_uint(cl, start, end); @@ -61,7 +62,7 @@ __gen_unpack_ulod(const uint8_t *restrict cl, uint32_t start, uint32_t end) } static inline float -__gen_unpack_slod(const uint8_t *restrict cl, uint32_t start, uint32_t end) +__gen_unpack_slod(const uint32_t *restrict cl, uint32_t start, uint32_t end) { int32_t u = __gen_unpack_sint(cl, start, end); @@ -69,7 +70,7 @@ __gen_unpack_slod(const uint8_t *restrict cl, uint32_t start, uint32_t end) } static inline uint64_t -__gen_unpack_padded(const uint8_t *restrict cl, uint32_t start, uint32_t end) +__gen_unpack_padded(const uint32_t *restrict cl, uint32_t start, uint32_t end) { unsigned val = __gen_unpack_uint(cl, start, end); unsigned shift = val & 0b11111; @@ -99,7 +100,7 @@ __gen_unpack_padded(const uint8_t *restrict cl, uint32_t start, uint32_t end) #define pan_unpack(src, T, name) \ struct PREFIX1(T) name; \ - PREFIX2(T, unpack)((uint8_t *)(src), &name) + PREFIX2(T, unpack)((uint32_t *)(src), &name) #define pan_print(fp, T, var, indent) PREFIX2(T, print)(fp, &(var), indent)