isaspec: Fix bitmask conversions when isa.bitsize < 64
authorMary <mary@mary.zone>
Fri, 11 Nov 2022 16:02:09 +0000 (17:02 +0100)
committerMary <mary@mary.zone>
Fri, 6 Jan 2023 23:14:10 +0000 (00:14 +0100)
Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20541>

src/compiler/isaspec/decode.py
src/compiler/isaspec/encode.py
src/compiler/isaspec/isa.py

index 7cdfd0f..aaf267f 100755 (executable)
@@ -246,7 +246,11 @@ next_instruction(bitmask_t *instr, BITSET_WORD *start)
 static inline uint64_t
 bitmask_to_uint64_t(bitmask_t mask)
 {
+%   if isa.bitsize <= 32:
+    return mask.bitset[0];
+%   else:
     return ((uint64_t)mask.bitset[1] << 32) | mask.bitset[0];
+%   endif
 }
 
 static inline bitmask_t
@@ -254,7 +258,9 @@ uint64_t_to_bitmask(uint64_t val)
 {
     bitmask_t mask = {
         .bitset[0] = val & 0xffffffff,
+%   if isa.bitsize > 32:
         .bitset[1] = (val >> 32) & 0xffffffff,
+%   endif
     };
 
     return mask;
index 5993ee6..acaa457 100755 (executable)
@@ -357,7 +357,11 @@ typedef struct {
 static inline uint64_t
 bitmask_to_uint64_t(bitmask_t mask)
 {
+%   if isa.bitsize <= 32:
+    return mask.bitset[0];
+%   else:
     return ((uint64_t)mask.bitset[1] << 32) | mask.bitset[0];
+%   endif
 }
 
 static inline bitmask_t
@@ -365,7 +369,9 @@ uint64_t_to_bitmask(uint64_t val)
 {
     bitmask_t mask = {
         .bitset[0] = val & 0xffffffff,
+%   if isa.bitsize > 32:
         .bitset[1] = (val >> 32) & 0xffffffff,
+%   endif
     };
 
     return mask;
index 8f53df1..e87f191 100644 (file)
@@ -472,6 +472,9 @@ class ISA(object):
             self.leafs.setdefault(b.name, []).append(b)
 
     def validate_isa(self):
+        # We only support multiples of 32 bits for now
+        assert self.bitsize % 32 == 0
+
         # Do one-time fixups
         # Remove non-leaf nodes from the leafs table:
         for name, bitsets in list(self.leafs.items()):