diff --git a/src/imagination/pco/pco_builder_ops.h.py b/src/imagination/pco/pco_builder_ops.h.py index 2ceb7a21513..296c6f4013d 100644 --- a/src/imagination/pco/pco_builder_ops.h.py +++ b/src/imagination/pco/pco_builder_ops.h.py @@ -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; } diff --git a/src/imagination/pco/pco_info.c.py b/src/imagination/pco/pco_info.c.py index 01662e3a7e1..f5bc62b1e08 100644 --- a/src/imagination/pco/pco_info.c.py +++ b/src/imagination/pco/pco_info.c.py @@ -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 diff --git a/src/imagination/pco/pco_internal.h b/src/imagination/pco/pco_internal.h index 43ed1097d29..28fb8e42984 100644 --- a/src/imagination/pco/pco_internal.h +++ b/src/imagination/pco/pco_internal.h @@ -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]; diff --git a/src/imagination/pco/pco_ops.py b/src/imagination/pco/pco_ops.py index 7b9609970bc..1e9509d31e0 100644 --- a/src/imagination/pco/pco_ops.py +++ b/src/imagination/pco/pco_ops.py @@ -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', diff --git a/src/imagination/pco/pco_print.c b/src/imagination/pco/pco_print.c index 8d653d45648..436728256a8 100644 --- a/src/imagination/pco/pco_print.c +++ b/src/imagination/pco/pco_print.c @@ -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); diff --git a/src/imagination/pco/pco_pygen_common.py b/src/imagination/pco/pco_pygen_common.py index 729bbde435e..0f809ff65ac 100644 --- a/src/imagination/pco/pco_pygen_common.py +++ b/src/imagination/pco/pco_pygen_common.py @@ -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)