pco, pygen: distinguish hw ops that are built directly into instruction groups

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-22 17:45:47 +01:00 committed by Marge Bot
parent f3cc7c128c
commit 0d85b71387
6 changed files with 32 additions and 14 deletions

View file

@ -85,7 +85,7 @@ struct ${op.bname}_mods {
static
pco_instr *_${op.bname}(${op.builder_params[0]})
{
pco_instr *instr = pco_instr_create(pco_cursor_func(b->cursor),
pco_instr *instr = pco_instr_create(${op.builder_params[4]},
${op.cname.upper()},
${op.num_dests},
${op.num_srcs});
@ -108,7 +108,9 @@ pco_instr *_${op.bname}(${op.builder_params[0]})
% endif
% endfor
% if op.op_type != 'hw_direct':
pco_builder_insert_instr(b, instr);
% endif
return instr;
}

View file

@ -43,7 +43,7 @@ const struct pco_op_info pco_op_info[_PCO_OP_COUNT] = {
[${index}] = ${csrc_mods},
% endfor
},
.is_pseudo = ${str(op.is_pseudo).lower()},
.type = PCO_OP_TYPE_${op.op_type.upper()},
.has_target_cf_node = ${str(op.has_target_cf_node).lower()},
},
% endfor

View file

@ -347,7 +347,7 @@ struct pco_op_info {
uint8_t mod_map[_PCO_OP_MOD_COUNT]; /** Index into pco_instr::mod. */
uint64_t dest_mods[_PCO_OP_MAX_DESTS]; /** Supported dest mods. */
uint64_t src_mods[_PCO_OP_MAX_SRCS]; /** Supported source mods. */
bool is_pseudo; /** Set if op is a pseudo-instruction. */
enum pco_op_type type; /** Op type. */
bool has_target_cf_node; /** Set if op has a cf-node as a target. */
};
extern const struct pco_op_info pco_op_info[_PCO_OP_COUNT];

View file

@ -3,6 +3,12 @@
from pco_pygen_common import *
OP_TYPE = enum_type('op_type', [
'pseudo',
'hw',
'hw_direct',
])
MOD_TYPE = enum_type('mod_type', [
'bool',
'uint',

View file

@ -407,7 +407,7 @@ static void pco_print_instr(pco_print_state *state, pco_instr *instr)
/* Early mods. */
pco_print_instr_mods(state, info, instr, true);
if (info->is_pseudo)
if (info->type == PCO_OP_TYPE_PSEUDO)
RED(state);
else
GREEN(state);

View file

@ -406,11 +406,11 @@ def bit_struct(name, bit_set, field_mappings, data=None):
# Op definitions.
class Op(object):
def __init__(self, name, cname, bname, is_pseudo, op_mods, cop_mods, op_mod_map, num_dests, num_srcs, dest_mods, cdest_mods, src_mods, csrc_mods, has_target_cf_node, builder_params):
def __init__(self, name, cname, bname, op_type, op_mods, cop_mods, op_mod_map, num_dests, num_srcs, dest_mods, cdest_mods, src_mods, csrc_mods, has_target_cf_node, builder_params):
self.name = name
self.cname = cname
self.bname = bname
self.is_pseudo = is_pseudo
self.op_type = op_type
self.op_mods = op_mods
self.cop_mods = cop_mods
self.op_mod_map = op_mod_map
@ -425,7 +425,7 @@ class Op(object):
ops = {}
def op(name, is_pseudo, op_mods, num_dests, num_srcs, dest_mods, src_mods, has_target_cf_node):
def op(name, op_type, op_mods, num_dests, num_srcs, dest_mods, src_mods, has_target_cf_node):
assert name not in ops.keys(), f'Duplicate op "{name}".'
_name = name.replace('.', '_')
@ -436,10 +436,17 @@ def op(name, is_pseudo, op_mods, num_dests, num_srcs, dest_mods, src_mods, has_t
cdest_mods = {i: 0 if not dest_mods else ' | '.join([f'(1 << {ref_mod.cname})' for ref_mod in destn_mods]) for i, destn_mods in enumerate(dest_mods)}
csrc_mods = {i: 0 if not src_mods else ' | '.join([f'(1 << {ref_mod.cname})' for ref_mod in srcn_mods]) for i, srcn_mods in enumerate(src_mods)}
# Typed and untyped params for builder.
builder_params = ['', '', '', '']
builder_params[0] += 'pco_builder *b'
builder_params[1] += 'b'
builder_params = ['', '', '', '', '']
if op_type != 'hw_direct':
builder_params[0] = 'pco_builder *b'
builder_params[1] = 'b'
builder_params[4] = 'pco_cursor_func(b->cursor)'
else:
builder_params[0] = 'pco_func *func'
builder_params[1] = 'func'
builder_params[4] = 'func'
if has_target_cf_node:
builder_params[0] += ', pco_cf_node *target_cf_node'
builder_params[1] += ', target_cf_node'
@ -457,12 +464,15 @@ def op(name, is_pseudo, op_mods, num_dests, num_srcs, dest_mods, src_mods, has_t
builder_params[2] = ', ...'
builder_params[3] = f', (struct {bname}_mods){{0, ##__VA_ARGS__}}'
op = Op(name, cname, bname, is_pseudo, op_mods, cop_mods, op_mod_map, num_dests, num_srcs, dest_mods, cdest_mods, src_mods, csrc_mods, has_target_cf_node, builder_params)
op = Op(name, cname, bname, op_type, op_mods, cop_mods, op_mod_map, num_dests, num_srcs, dest_mods, cdest_mods, src_mods, csrc_mods, has_target_cf_node, builder_params)
ops[name] = op
return op
def pseudo_op(name, op_mods=[], num_dests=0, num_srcs=0, dest_mods=[], src_mods=[], has_target_cf_node=False):
return op(name, True, op_mods, num_dests, num_srcs, dest_mods, src_mods, has_target_cf_node)
return op(name, 'pseudo', op_mods, num_dests, num_srcs, dest_mods, src_mods, has_target_cf_node)
def hw_op(name, op_mods=[], num_dests=0, num_srcs=0, dest_mods=[], src_mods=[], has_target_cf_node=False):
return op(name, False, op_mods, num_dests, num_srcs, dest_mods, src_mods, has_target_cf_node)
return op(name, 'hw', op_mods, num_dests, num_srcs, dest_mods, src_mods, has_target_cf_node)
def hw_direct_op(name, num_dests=0, num_srcs=0, has_target_cf_node=False):
return op(name, 'hw_direct', [], num_dests, num_srcs, [], [], has_target_cf_node)