aco: split read/writelane opcode into VOP2/VOP3 version for SI/CI
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
This commit is contained in:
@@ -163,7 +163,7 @@ Temp emit_wqm(isel_context *ctx, Temp src, Temp dst=Temp(0, s1), bool program_ne
|
||||
static Temp emit_bpermute(isel_context *ctx, Builder &bld, Temp index, Temp data)
|
||||
{
|
||||
if (index.regClass() == s1)
|
||||
return bld.vop3(aco_opcode::v_readlane_b32, bld.def(s1), data, index);
|
||||
return bld.readlane(bld.def(s1), data, index);
|
||||
|
||||
Temp index_x4 = bld.vop2(aco_opcode::v_lshlrev_b32, bld.def(v1), Operand(2u), index);
|
||||
|
||||
@@ -6098,14 +6098,14 @@ void visit_intrinsic(isel_context *ctx, nir_intrinsic_instr *instr)
|
||||
Temp dst = get_ssa_temp(ctx, &instr->dest.ssa);
|
||||
if (dst.regClass() == v1) {
|
||||
/* src2 is ignored for writelane. RA assigns the same reg for dst */
|
||||
emit_wqm(ctx, bld.vop3(aco_opcode::v_writelane_b32, bld.def(v1), val, lane, src), dst);
|
||||
emit_wqm(ctx, bld.writelane(bld.def(v1), val, lane, src), dst);
|
||||
} else if (dst.regClass() == v2) {
|
||||
Temp src_lo = bld.tmp(v1), src_hi = bld.tmp(v1);
|
||||
Temp val_lo = bld.tmp(s1), val_hi = bld.tmp(s1);
|
||||
bld.pseudo(aco_opcode::p_split_vector, Definition(src_lo), Definition(src_hi), src);
|
||||
bld.pseudo(aco_opcode::p_split_vector, Definition(val_lo), Definition(val_hi), val);
|
||||
Temp lo = emit_wqm(ctx, bld.vop3(aco_opcode::v_writelane_b32, bld.def(v1), val_lo, lane, src_hi));
|
||||
Temp hi = emit_wqm(ctx, bld.vop3(aco_opcode::v_writelane_b32, bld.def(v1), val_hi, lane, src_hi));
|
||||
Temp lo = emit_wqm(ctx, bld.writelane(bld.def(v1), val_lo, lane, src_hi));
|
||||
Temp hi = emit_wqm(ctx, bld.writelane(bld.def(v1), val_hi, lane, src_hi));
|
||||
bld.pseudo(aco_opcode::p_create_vector, Definition(dst), lo, hi);
|
||||
emit_split_vector(ctx, dst, 2);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user