From: Georg Lehmann Date: Tue, 21 Mar 2023 12:19:59 +0000 (+0100) Subject: aco/optimizer: preserve opsel when fusing fma X-Git-Tag: upstream/23.3.3~10835 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8e6d79d10da9b1c26712cc501cf283993f1beca8;p=platform%2Fupstream%2Fmesa.git aco/optimizer: preserve opsel when fusing fma Reviewed-by: Rhys Perry Part-of: --- diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index 3081975..9cda0c3 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -4305,6 +4305,7 @@ combine_instruction(opt_ctx& ctx, aco_ptr& instr) bool clamp = false; bitarray8 opsel_lo = 0; bitarray8 opsel_hi = 0; + bitarray8 opsel = 0; unsigned mul_op_idx = (instr->isVOP3P() ? 3 : 1) - add_op_idx; VALU_instruction& valu_mul = mul_instr->valu(); @@ -4314,12 +4315,15 @@ combine_instruction(opt_ctx& ctx, aco_ptr& instr) abs[1] = valu_mul.abs[1]; opsel_lo = valu_mul.opsel_lo & 0x3; opsel_hi = valu_mul.opsel_hi & 0x3; + opsel = valu_mul.opsel & 0x3; VALU_instruction& valu = instr->valu(); neg[2] = valu.neg[add_op_idx]; abs[2] = valu.abs[add_op_idx]; opsel_lo[2] = valu.opsel_lo[add_op_idx]; opsel_hi[2] = valu.opsel_hi[add_op_idx]; + opsel[2] = valu.opsel[add_op_idx]; + opsel[3] = valu.opsel[3]; omod = valu.omod; clamp = valu.clamp; /* abs of the multiplication result */ @@ -4342,6 +4346,7 @@ combine_instruction(opt_ctx& ctx, aco_ptr& instr) aco_ptr mad; if (add_instr->isVOP3P() || mul_instr->isVOP3P()) { assert(!omod); + assert(!opsel); aco_opcode mad_op = add_instr->definitions[0].bytes() == 2 ? aco_opcode::v_fma_mixlo_f16 : aco_opcode::v_fma_mix_f32; @@ -4375,6 +4380,7 @@ combine_instruction(opt_ctx& ctx, aco_ptr& instr) mad->clamp = clamp; mad->opsel_lo = opsel_lo; mad->opsel_hi = opsel_hi; + mad->opsel = opsel; mad->definitions[0] = add_instr->definitions[0]; mad->definitions[0].setPrecise(add_instr->definitions[0].isPrecise() || mul_instr->definitions[0].isPrecise());