brw: factor out source extraction for rematerialization

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29663>
This commit is contained in:
Lionel Landwerlin 2024-06-17 16:13:06 +03:00 committed by Marge Bot
parent 8fbbc9c301
commit c7b312ad45

View file

@ -4630,48 +4630,42 @@ try_rebuild_resource(nir_to_brw_state &ntb, const brw::fs_builder &bld, nir_def
break; break;
} }
fs_reg srcs[3];
for (unsigned s = 0; s < nir_op_infos[alu->op].num_inputs; s++) {
srcs[s] = offset(
ntb.resource_insts[alu->src[s].src.ssa->index]->dst,
ubld8, alu->src[s].swizzle[0]);
assert(srcs[s].file != BAD_FILE);
assert(srcs[s].type == BRW_TYPE_UD);
}
switch (alu->op) { switch (alu->op) {
case nir_op_iadd: { case nir_op_iadd: {
fs_reg src0 = ntb.resource_insts[alu->src[0].src.ssa->index]->dst; ubld8.ADD(srcs[0].file != IMM ? srcs[0] : srcs[1],
fs_reg src1 = ntb.resource_insts[alu->src[1].src.ssa->index]->dst; srcs[0].file != IMM ? srcs[1] : srcs[0],
assert(src0.file != BAD_FILE && src1.file != BAD_FILE);
assert(src0.type == BRW_TYPE_UD);
assert(src1.type == BRW_TYPE_UD);
ubld8.ADD(src0.file != IMM ? src0 : src1,
src0.file != IMM ? src1 : src0,
&ntb.resource_insts[def->index]); &ntb.resource_insts[def->index]);
break; break;
} }
case nir_op_iadd3: { case nir_op_iadd3: {
fs_reg dst = ubld8.vgrf(BRW_TYPE_UD); fs_reg dst = ubld8.vgrf(srcs[0].type);
fs_reg src0 = ntb.resource_insts[alu->src[0].src.ssa->index]->dst;
fs_reg src1 = ntb.resource_insts[alu->src[1].src.ssa->index]->dst;
fs_reg src2 = ntb.resource_insts[alu->src[2].src.ssa->index]->dst;
assert(src0.file != BAD_FILE && src1.file != BAD_FILE && src2.file != BAD_FILE);
assert(src0.type == BRW_TYPE_UD);
ntb.resource_insts[def->index] = ntb.resource_insts[def->index] =
ubld8.ADD3(dst, ubld8.ADD3(dst,
src1.file == IMM ? src1 : src0, srcs[1].file == IMM ? srcs[1] : srcs[0],
src1.file == IMM ? src0 : src1, srcs[1].file == IMM ? srcs[0] : srcs[1],
src2); srcs[2]);
break; break;
} }
case nir_op_ushr: { case nir_op_ushr: {
fs_reg src0 = ntb.resource_insts[alu->src[0].src.ssa->index]->dst; enum brw_reg_type utype =
fs_reg src1 = ntb.resource_insts[alu->src[1].src.ssa->index]->dst; brw_type_with_size(srcs[0].type,
assert(src0.file != BAD_FILE && src1.file != BAD_FILE); brw_type_size_bits(srcs[0].type));
assert(src0.type == BRW_TYPE_UD); ubld8.SHR(retype(srcs[0], utype),
assert(src1.type == BRW_TYPE_UD); retype(srcs[1], utype),
ubld8.SHR(src0, src1, &ntb.resource_insts[def->index]); &ntb.resource_insts[def->index]);
break; break;
} }
case nir_op_ishl: { case nir_op_ishl: {
fs_reg src0 = ntb.resource_insts[alu->src[0].src.ssa->index]->dst; ubld8.SHL(srcs[0], srcs[1], &ntb.resource_insts[def->index]);
fs_reg src1 = ntb.resource_insts[alu->src[1].src.ssa->index]->dst;
assert(src0.file != BAD_FILE && src1.file != BAD_FILE);
assert(src0.type == BRW_TYPE_UD);
assert(src1.type == BRW_TYPE_UD);
ubld8.SHL(src0, src1, &ntb.resource_insts[def->index]);
break; break;
} }
case nir_op_mov: { case nir_op_mov: {