Reviewed-by: Eric Anholt <eric@anholt.net>tags/11.0-branchpoint
| } | } | ||||
| } | } | ||||
| /** | |||||
| * Makes every conflict on the given register transitive. In other words, | |||||
| * every register that conflicts with r will now conflict with every other | |||||
| * register conflicting with r. | |||||
| * | |||||
| * This can simplify code for setting up multiple register classes | |||||
| * which are aggregates of some base hardware registers, compared to | |||||
| * explicitly using ra_add_reg_conflict. | |||||
| */ | |||||
| void | |||||
| ra_make_reg_conflicts_transitive(struct ra_regs *regs, unsigned int r) | |||||
| { | |||||
| struct ra_reg *reg = ®s->regs[r]; | |||||
| BITSET_WORD tmp; | |||||
| int c; | |||||
| BITSET_FOREACH_SET(c, tmp, reg->conflicts, regs->count) { | |||||
| struct ra_reg *other = ®s->regs[c]; | |||||
| for (unsigned i = 0; i < BITSET_WORDS(regs->count); i++) | |||||
| other->conflicts[i] |= reg->conflicts[i]; | |||||
| } | |||||
| } | |||||
| unsigned int | unsigned int | ||||
| ra_alloc_reg_class(struct ra_regs *regs) | ra_alloc_reg_class(struct ra_regs *regs) | ||||
| { | { |
| unsigned int r1, unsigned int r2); | unsigned int r1, unsigned int r2); | ||||
| void ra_add_transitive_reg_conflict(struct ra_regs *regs, | void ra_add_transitive_reg_conflict(struct ra_regs *regs, | ||||
| unsigned int base_reg, unsigned int reg); | unsigned int base_reg, unsigned int reg); | ||||
| 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_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, | void ra_set_num_conflicts(struct ra_regs *regs, unsigned int class_a, | ||||
| unsigned int class_b, unsigned int num_conflicts); | unsigned int class_b, unsigned int num_conflicts); |