diff --git a/src/imagination/pco/pco_builder_ops.h.py b/src/imagination/pco/pco_builder_ops.h.py index 45e1419d69d..bdb1340eaac 100644 --- a/src/imagination/pco/pco_builder_ops.h.py +++ b/src/imagination/pco/pco_builder_ops.h.py @@ -127,18 +127,28 @@ pco_instr *_${op.bname}(${op.builder_params[0]}) { pco_instr *instr = pco_instr_create(${op.builder_params[4]}, ${op.cname.upper()}, - ${op.num_dests}, - ${op.num_srcs}); + ${'num_dests' if op.num_dests == VARIABLE else op.num_dests}, + ${'num_srcs' if op.num_srcs == VARIABLE else op.num_srcs}); % if op.has_target_cf_node: instr->target_cf_node = target_cf_node; % endif - % for d in range(op.num_dests): + % if op.num_dests == VARIABLE: + for (unsigned d = 0; d < num_dests; ++d) + instr->dest[d] = dest[d]; + % else: + % for d in range(op.num_dests): instr->dest[${d}] = dest${d}; - % endfor - % for s in range(op.num_srcs): + % endfor + % endif + % if op.num_srcs == VARIABLE: + for (unsigned s = 0; s < num_srcs; ++s) + instr->src[s] = src[s]; + % else: + % for s in range(op.num_srcs): instr->src[${s}] = src${s}; - % endfor + % endfor + % endif % for op_mod in op.op_mods: % if op_mod.t.nzdefault is None: @@ -159,7 +169,7 @@ pco_instr *_${op.bname}(${op.builder_params[0]}) def main(): try: - print(Template(template).render(ops=ops, op_mods=op_mods, ref_mods=ref_mods)) + print(Template(template).render(ops=ops, op_mods=op_mods, ref_mods=ref_mods, VARIABLE=VARIABLE)) except: raise Exception(exceptions.text_error_template().render()) diff --git a/src/imagination/pco/pco_pygen_common.py b/src/imagination/pco/pco_pygen_common.py index 42b19998912..4cc87f00975 100644 --- a/src/imagination/pco/pco_pygen_common.py +++ b/src/imagination/pco/pco_pygen_common.py @@ -4,6 +4,7 @@ from enum import Enum, auto _ = None +VARIABLE = ~0 prefix = 'pco' @@ -455,13 +456,21 @@ def op(name, op_type, op_mods, num_dests, num_srcs, dest_mods, src_mods, has_tar builder_params[0] += ', pco_cf_node *target_cf_node' builder_params[1] += ', target_cf_node' - for d in range(num_dests): - builder_params[0] += f', pco_ref dest{d}' - builder_params[1] += f', dest{d}' + if num_dests == VARIABLE: + builder_params[0] += f', unsigned num_dests, pco_ref *dest' + builder_params[1] += f', num_dests, dests' + else: + for d in range(num_dests): + builder_params[0] += f', pco_ref dest{d}' + builder_params[1] += f', dest{d}' - for s in range(num_srcs): - builder_params[0] += f', pco_ref src{s}' - builder_params[1] += f', src{s}' + if num_srcs == VARIABLE: + builder_params[0] += f', unsigned num_srcs, pco_ref *src' + builder_params[1] += f', num_srcs, srcs' + else: + for s in range(num_srcs): + builder_params[0] += f', pco_ref src{s}' + builder_params[1] += f', src{s}' if bool(op_mods): builder_params[0] += f', struct {prefix}_{_name}_mods mods'