dst[n-1] = (src[n-1] & last_mask) | (dst[n-1] & ~last_mask);
}
+/**
+ * Convenience macro for raw bitset iteration.
+ * @param bitset The bitset.
+ * @param size Size of the bitset.
+ * @param elm A size_t variable.
+ */
+#define rbitset_foreach(bitset, size, elm) \
+ for (size_t elm = 0; (elm = rbitset_next_max((bitset), elm, size, 1)) != (size_t)-1; ++elm)
+
#endif
return bitset_next_set(available, 0);
}
-static bitset_t const *get_decisive_partner_regs(be_operand_t const *const o1)
+static unsigned const *get_decisive_partner_regs(be_operand_t const *const o1, size_t const n_regs)
{
be_operand_t const *const o2 = o1->partner;
assert(!o2 || o1->req->cls == o2->req->cls);
- if (!o2 || bitset_contains(o1->regs, o2->regs)) {
+ if (!o2 || rbitset_contains(o1->regs, o2->regs, n_regs)) {
return o1->regs;
- } else if (bitset_contains(o2->regs, o1->regs)) {
+ } else if (rbitset_contains(o2->regs, o1->regs, n_regs)) {
return o2->regs;
} else {
return NULL;
/* For each out operand, try to find an in operand which can be assigned the
* same register as the out operand. */
int const n_regs = env->cls->n_regs;
- bitset_t *const bs = bitset_alloca(n_regs);
+ unsigned *const bs = rbitset_alloca(n_regs);
be_lv_t *const lv = be_get_irg_liveness(env->irg);
for (int j = 0; j < insn->use_start; ++j) {
/* Try to find an in operand which has ... */
if (op->partner || be_values_interfere(lv, insn->irn, op->carrier))
continue;
- bitset_copy(bs, op->regs);
- bitset_and(bs, out_op->regs);
- int const n_total = bitset_popcount(op->regs);
- if (!bitset_is_empty(bs) && n_total < smallest_n_regs) {
+ rbitset_copy(bs, op->regs, n_regs);
+ rbitset_and(bs, out_op->regs, n_regs);
+ int const n_total = rbitset_popcount(op->regs, n_regs);
+ if (!rbitset_is_empty(bs, n_regs) && n_total < smallest_n_regs) {
smallest = op;
smallest_n_regs = n_total;
}
DBG((dbg, LEVEL_2, "\tassociating %+F and %+F\n", op->carrier, partner));
- bitset_t const *const bs = get_decisive_partner_regs(op);
+ unsigned const *const bs = get_decisive_partner_regs(op, n_regs);
if (bs) {
DBG((dbg, LEVEL_2, "\tallowed registers for %+F: %B\n", op->carrier, bs));
- bitset_foreach(bs, col) {
+ rbitset_foreach(bs, n_regs, col) {
#if USE_HUNGARIAN
hungarian_add(bp, n_alloc, col, 1);
#else
arch_register_req_t const *const req = op->req;
assert(req->cls == env->cls);
- if (req->type & arch_register_req_type_limited) {
- bitset_t *regs = bitset_obstack_alloc(obst, env->cls->n_regs);
- rbitset_copy_to_bitset(req->limited, regs);
- op->regs = regs;
- } else {
- op->regs = env->allocatable_regs;
- }
+ op->regs = arch_register_req_is(req, limited) ?
+ req->limited : env->allocatable_regs->data;
}
return insn;