mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 11:28:05 +02:00
pco, pygen: iterators for igrps and the instrs they contain
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/33998>
This commit is contained in:
parent
04f3b3a5c9
commit
c201332fff
3 changed files with 93 additions and 1 deletions
|
|
@ -242,6 +242,7 @@ ForEachMacros: [
|
||||||
'pco_foreach_func_in_shader',
|
'pco_foreach_func_in_shader',
|
||||||
'pco_foreach_func_in_shader_rev',
|
'pco_foreach_func_in_shader_rev',
|
||||||
'pco_foreach_igrp_in_block',
|
'pco_foreach_igrp_in_block',
|
||||||
|
'pco_foreach_igrp_in_func',
|
||||||
'pco_foreach_instr_dest',
|
'pco_foreach_instr_dest',
|
||||||
'pco_foreach_instr_dest_ssa',
|
'pco_foreach_instr_dest_ssa',
|
||||||
'pco_foreach_instr_src',
|
'pco_foreach_instr_src',
|
||||||
|
|
@ -254,6 +255,8 @@ ForEachMacros: [
|
||||||
'pco_foreach_instr_in_func_safe',
|
'pco_foreach_instr_in_func_safe',
|
||||||
'pco_foreach_instr_in_func_rev',
|
'pco_foreach_instr_in_func_rev',
|
||||||
'pco_foreach_instr_in_func_safe_rev',
|
'pco_foreach_instr_in_func_safe_rev',
|
||||||
|
'pco_foreach_instr_in_igrp',
|
||||||
|
'pco_foreach_instr_in_igrp_rev',
|
||||||
'pco_foreach_phi_src_in_instr',
|
'pco_foreach_phi_src_in_instr',
|
||||||
'rogue_foreach_block',
|
'rogue_foreach_block',
|
||||||
'rogue_foreach_block_safe',
|
'rogue_foreach_block_safe',
|
||||||
|
|
|
||||||
|
|
@ -223,7 +223,10 @@ typedef struct _pco_instr {
|
||||||
pco_block *parent_block; /** Basic block containing the instruction. */
|
pco_block *parent_block; /** Basic block containing the instruction. */
|
||||||
};
|
};
|
||||||
|
|
||||||
pco_igrp *parent_igrp; /** Igrp containing the instruction. */
|
struct {
|
||||||
|
enum pco_op_phase phase; /** Igrp phase the instruction is in. */
|
||||||
|
pco_igrp *parent_igrp; /** Igrp containing the instruction. */
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
pco_func *parent_func; /** Parent function. */
|
pco_func *parent_func; /** Parent function. */
|
||||||
|
|
@ -526,6 +529,19 @@ PCO_DEFINE_CAST(pco_cf_node_as_func,
|
||||||
pco_foreach_block_in_func_rev (block, func) \
|
pco_foreach_block_in_func_rev (block, func) \
|
||||||
list_for_each_entry_safe_rev (pco_instr, instr, &(block)->instrs, link)
|
list_for_each_entry_safe_rev (pco_instr, instr, &(block)->instrs, link)
|
||||||
|
|
||||||
|
#define pco_foreach_igrp_in_func(igrp, func) \
|
||||||
|
assert(func->parent_shader->is_grouped); \
|
||||||
|
pco_foreach_block_in_func (block, func) \
|
||||||
|
list_for_each_entry (pco_igrp, igrp, &(block)->instrs, link)
|
||||||
|
|
||||||
|
#define pco_foreach_instr_in_igrp(instr, igrp) \
|
||||||
|
for (pco_instr *instr = pco_igrp_first_instr(igrp); instr != NULL; \
|
||||||
|
instr = pco_igrp_next_instr(instr))
|
||||||
|
|
||||||
|
#define pco_foreach_instr_in_igrp_rev(instr, igrp) \
|
||||||
|
for (pco_instr *instr = pco_igrp_last_instr(igrp); instr != NULL; \
|
||||||
|
instr = pco_igrp_prev_instr(instr))
|
||||||
|
|
||||||
#define pco_foreach_instr_dest(pdest, instr) \
|
#define pco_foreach_instr_dest(pdest, instr) \
|
||||||
for (pco_ref *pdest = &instr->dest[0]; \
|
for (pco_ref *pdest = &instr->dest[0]; \
|
||||||
pdest < &instr->dest[instr->num_dests]; \
|
pdest < &instr->dest[instr->num_dests]; \
|
||||||
|
|
@ -1037,6 +1053,75 @@ static inline pco_igrp *pco_prev_igrp(pco_igrp *igrp)
|
||||||
return list_entry(igrp->link.prev, pco_igrp, link);
|
return list_entry(igrp->link.prev, pco_igrp, link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Returns the first instruction in an igrp.
|
||||||
|
*
|
||||||
|
* \param[in] igrp The igrp.
|
||||||
|
* \return The first instruction.
|
||||||
|
*/
|
||||||
|
static inline pco_instr *pco_igrp_first_instr(pco_igrp *igrp)
|
||||||
|
{
|
||||||
|
for (enum pco_op_phase p = 0; p < _PCO_OP_PHASE_COUNT; ++p)
|
||||||
|
if (igrp->instrs[p])
|
||||||
|
return igrp->instrs[p];
|
||||||
|
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Returns the last instruction in an igrp.
|
||||||
|
*
|
||||||
|
* \param[in] igrp The igrp.
|
||||||
|
* \return The last instruction.
|
||||||
|
*/
|
||||||
|
static inline pco_instr *pco_igrp_last_instr(pco_igrp *igrp)
|
||||||
|
{
|
||||||
|
for (enum pco_op_phase p = _PCO_OP_PHASE_COUNT; p-- > 0;)
|
||||||
|
if (igrp->instrs[p])
|
||||||
|
return igrp->instrs[p];
|
||||||
|
|
||||||
|
unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Returns the next instruction in an igrp.
|
||||||
|
*
|
||||||
|
* \param[in] instr The current instruction.
|
||||||
|
* \return The next instruction, or NULL if we've reached the end of the igrp.
|
||||||
|
*/
|
||||||
|
static inline pco_instr *pco_igrp_next_instr(pco_instr *instr)
|
||||||
|
{
|
||||||
|
if (!instr)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
pco_igrp *igrp = instr->parent_igrp;
|
||||||
|
for (enum pco_op_phase p = instr->phase + 1; p < _PCO_OP_PHASE_COUNT; ++p)
|
||||||
|
if (igrp->instrs[p])
|
||||||
|
return igrp->instrs[p];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Returns the previous instruction in an igrp.
|
||||||
|
*
|
||||||
|
* \param[in] instr The current instruction.
|
||||||
|
* \return The previous instruction, or NULL if we've reached the end of the
|
||||||
|
* igrp.
|
||||||
|
*/
|
||||||
|
static inline pco_instr *pco_igrp_prev_instr(pco_instr *instr)
|
||||||
|
{
|
||||||
|
if (!instr)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
pco_igrp *igrp = instr->parent_igrp;
|
||||||
|
for (enum pco_op_phase p = instr->phase; p-- > 0;)
|
||||||
|
if (igrp->instrs[p])
|
||||||
|
return igrp->instrs[p];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Debug printing helpers. */
|
/* Debug printing helpers. */
|
||||||
static inline bool pco_should_print_nir(nir_shader *nir)
|
static inline bool pco_should_print_nir(nir_shader *nir)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -534,6 +534,8 @@ def group_map(op, hdr, enc_ops, srcs=[], iss=[], dests=[]):
|
||||||
|
|
||||||
op_mappings.append(f'list_del(&{{1}}->link);')
|
op_mappings.append(f'list_del(&{{1}}->link);')
|
||||||
op_mappings.append(f'{{}}->instrs[{phase}] = {{}};')
|
op_mappings.append(f'{{}}->instrs[{phase}] = {{}};')
|
||||||
|
op_mappings.append(f'{{0}}->instrs[{phase}]->phase = {phase};')
|
||||||
|
op_mappings.append(f'{{0}}->instrs[{phase}]->parent_igrp = {{0}};')
|
||||||
op_mappings.append(f'ralloc_steal(igrp, {{1}});')
|
op_mappings.append(f'ralloc_steal(igrp, {{1}});')
|
||||||
else:
|
else:
|
||||||
for _phase, enc_op, *_enc_spec in enc_ops:
|
for _phase, enc_op, *_enc_spec in enc_ops:
|
||||||
|
|
@ -588,6 +590,8 @@ def group_map(op, hdr, enc_ops, srcs=[], iss=[], dests=[]):
|
||||||
enc_mapping += ');'
|
enc_mapping += ');'
|
||||||
|
|
||||||
op_mappings.append(enc_mapping)
|
op_mappings.append(enc_mapping)
|
||||||
|
op_mappings.append(f'{{0}}->instrs[{phase}]->phase = {phase};')
|
||||||
|
op_mappings.append(f'{{0}}->instrs[{phase}]->parent_igrp = {{0}};')
|
||||||
|
|
||||||
op_mappings.append(f'pco_instr_delete({{1}});')
|
op_mappings.append(f'pco_instr_delete({{1}});')
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue