pco, pygen: add support for instructions with variable srcs/dests

Signed-off-by: Simon Perretta <simon.perretta@imgtec.com>
Acked-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32258>
This commit is contained in:
Simon Perretta 2024-05-26 00:25:48 +01:00 committed by Marge Bot
parent 45139c72f7
commit fab0ef7d59
2 changed files with 32 additions and 13 deletions

View file

@ -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())

View file

@ -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'