From 561098cf7d8429b8e36a699b42c2d5fd46bb3e89 Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Thu, 23 May 2024 16:43:22 +0100 Subject: [PATCH] pco, pygen: add bitset support for op mods Signed-off-by: Simon Perretta Acked-by: Frank Binns Part-of: --- src/imagination/pco/pco_info.c.py | 1 + src/imagination/pco/pco_internal.h | 1 + src/imagination/pco/pco_print.c | 16 +++++++++++----- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/imagination/pco/pco_info.c.py b/src/imagination/pco/pco_info.c.py index 544f4f4c6a3..01662e3a7e1 100644 --- a/src/imagination/pco/pco_info.c.py +++ b/src/imagination/pco/pco_info.c.py @@ -55,6 +55,7 @@ const struct pco_op_mod_info pco_op_mod_info[_PCO_OP_MOD_COUNT] = { .print_early = ${str(op_mod.t.print_early).lower()}, .type = ${op_mod.ctype}, % if op_mod.t.base_type == BaseType.enum: + .is_bitset = ${str(op_mod.t.enum.is_bitset).lower()}, .strs = (const char * []){ % for elem in op_mod.t.enum.elems.values(): [${elem.cname}] = "${elem.string}", diff --git a/src/imagination/pco/pco_internal.h b/src/imagination/pco/pco_internal.h index e004454e820..4b82925ecde 100644 --- a/src/imagination/pco/pco_internal.h +++ b/src/imagination/pco/pco_internal.h @@ -354,6 +354,7 @@ extern const struct pco_op_info pco_op_info[_PCO_OP_COUNT]; /** Op mod info. */ struct pco_op_mod_info { bool print_early : 1; /** Set if printed before the op. */ + bool is_bitset : 1; /** Set if type is an enum bitset. */ enum pco_mod_type type; /** Datatype. */ union { const char *str; /** Mod name. */ diff --git a/src/imagination/pco/pco_print.c b/src/imagination/pco/pco_print.c index 7c8383fa7f1..fe11032641e 100644 --- a/src/imagination/pco/pco_print.c +++ b/src/imagination/pco/pco_print.c @@ -370,11 +370,17 @@ static void pco_print_instr_mods(pco_print_state *state, break; case PCO_MOD_TYPE_ENUM: - if (strlen(mod_info->strs[val])) { - if (print_early) - pco_printf(state, "%s ", mod_info->strs[val]); - else - pco_printf(state, ".%s", mod_info->strs[val]); + if (mod_info->is_bitset) { + u_foreach_bit (bit, val) { + pco_printf(state, ".%s", mod_info->strs[1U << bit]); + } + } else { + if (strlen(mod_info->strs[val])) { + if (print_early) + pco_printf(state, "%s ", mod_info->strs[val]); + else + pco_printf(state, ".%s", mod_info->strs[val]); + } } break;