X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Futil%2Fregister_allocate.h;h=c01f4aee47af1598ee30296543d5d7ea2d058ef7;hb=d0b644d9f9d9673d3fe28c8c200209f553adeda1;hp=d3448a11c77df10834a2fcc483fb76d6f683437f;hpb=7720ad65ae2cda1e08df162014c6903c654730af;p=mesa.git diff --git a/src/util/register_allocate.h b/src/util/register_allocate.h index d3448a11c77..c01f4aee47a 100644 --- a/src/util/register_allocate.h +++ b/src/util/register_allocate.h @@ -55,6 +55,11 @@ void ra_add_reg_conflict(struct ra_regs *regs, unsigned int r1, unsigned int r2); void ra_add_transitive_reg_conflict(struct ra_regs *regs, unsigned int base_reg, unsigned int reg); + +void +ra_add_transitive_reg_pair_conflict(struct ra_regs *regs, + unsigned int base_reg, unsigned int reg0, unsigned int reg1); + void ra_make_reg_conflicts_transitive(struct ra_regs *regs, unsigned int reg); void ra_class_add_reg(struct ra_regs *regs, unsigned int c, unsigned int reg); void ra_set_num_conflicts(struct ra_regs *regs, unsigned int class_a, @@ -74,19 +79,45 @@ void ra_set_finalize(struct ra_regs *regs, unsigned int **conflicts); */ struct ra_graph *ra_alloc_interference_graph(struct ra_regs *regs, unsigned int count); +void ra_resize_interference_graph(struct ra_graph *g, unsigned int count); void ra_set_node_class(struct ra_graph *g, unsigned int n, unsigned int c); +unsigned int ra_get_node_class(struct ra_graph *g, unsigned int n); +unsigned int ra_add_node(struct ra_graph *g, unsigned int c); + +/** @{ Register selection callback. + * + * The register allocator can use either one of two built-in register + * selection behaviors (ie. lowest-available or round-robin), or the + * user can implement it's own selection policy by setting an register + * selection callback. The parameters to the callback are: + * + * - n the graph node, ie. the virtual variable to select a + * register for + * - regs bitset of available registers to choose; this bitset + * contains *all* registers, but registers of different + * classes will not have their corresponding bit set. + * - data callback data specified in ra_set_select_reg_callback() + */ +typedef unsigned int (*ra_select_reg_callback)( + unsigned int n, /* virtual variable to choose a physical reg for */ + BITSET_WORD *regs, /* available physical regs to choose from */ + void *data); + void ra_set_select_reg_callback(struct ra_graph *g, - unsigned int (*callback)(struct ra_graph *g, - BITSET_WORD *regs, - void *data), + ra_select_reg_callback callback, void *data); void ra_add_node_interference(struct ra_graph *g, unsigned int n1, unsigned int n2); +void ra_reset_node_interference(struct ra_graph *g, unsigned int n); /** @} */ /** @{ Graph-coloring register allocation */ bool ra_allocate(struct ra_graph *g); +#define NO_REG ~0U +/** + * Returns NO_REG for a node that has not (yet) been assigned. + */ unsigned int ra_get_node_reg(struct ra_graph *g, unsigned int n); void ra_set_node_reg(struct ra_graph * g, unsigned int n, unsigned int reg); void ra_set_node_spill_cost(struct ra_graph *g, unsigned int n, float cost);