瀏覽代碼

util/ra: Add a function for making all conflicts on a register transitive

Reviewed-by: Eric Anholt <eric@anholt.net>
tags/11.0-branchpoint
Jason Ekstrand 10 年之前
父節點
當前提交
9b49284c22
共有 2 個檔案被更改,包括 24 行新增0 行删除
  1. 23
    0
      src/util/register_allocate.c
  2. 1
    0
      src/util/register_allocate.h

+ 23
- 0
src/util/register_allocate.c 查看文件

} }
} }


/**
* 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 = &regs->regs[r];
BITSET_WORD tmp;
int c;

BITSET_FOREACH_SET(c, tmp, reg->conflicts, regs->count) {
struct ra_reg *other = &regs->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)
{ {

+ 1
- 0
src/util/register_allocate.h 查看文件

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);

Loading…
取消
儲存