pan/midgard: Dynamically allocate r26/27 for spills

This allows us to spill two 128-bit values in the same bundle, since we
have two registers we can spill with. This improves the
register allocation flexibility in programs with heavy spilling, though
unfortunately it isn't sufficient (theoretically, 3.5 128-bit values can
be spilled from 3 vector units and 2 scalar units).

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
Alyssa Rosenzweig
2019-12-06 12:20:31 -05:00
parent 8e7f2b9ae3
commit 08b16fb321
2 changed files with 10 additions and 5 deletions
+9 -4
View File
@@ -598,12 +598,17 @@ v_load_store_scratch(
ins.constants[0] = byte;
if (is_store) {
/* r0 = r26, r1 = r27 */
assert(srcdest == SSA_FIXED_REGISTER(26) || srcdest == SSA_FIXED_REGISTER(27));
ins.src[0] = srcdest;
} else {
/* Ensure we are tightly swizzled so liveness analysis is
* correct */
for (unsigned i = 0; i < 4; ++i) {
if (!(mask & (1 << i)))
ins.swizzle[0][i] = COMPONENT_X;
}
} else
ins.dest = srcdest;
}
return ins;
}
+1 -1
View File
@@ -738,7 +738,7 @@ mir_spill_register(
st = v_mov(spill_node, spill_slot);
st.no_spill = true;
} else {
ins->dest = SSA_FIXED_REGISTER(26);
ins->dest = spill_index++;
ins->no_spill = true;
st = v_load_store_scratch(ins->dest, spill_slot, true, ins->mask);
}