diff --git a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp index 48a77d2edd6..03f1f11b95c 100644 --- a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp @@ -1225,12 +1225,12 @@ bool EmitAluInstruction::emit_alu_div_int(const nir_alu_instr& instr, bool use_s } void EmitAluInstruction::split_alu_modifiers(const nir_alu_src& src, - GPRVector::Values& v, int ncomp) + const GPRVector::Values& v, GPRVector::Values& out, int ncomp) { AluInstruction *alu = nullptr; for (int i = 0; i < ncomp; ++i) { - alu = new AluInstruction(op1_mov, v[i], v[i], {alu_write}); + alu = new AluInstruction(op1_mov, out[i], v[i], {alu_write}); if (src.abs) alu->set_flag(alu_src0_abs); if (src.negate) @@ -1251,8 +1251,12 @@ bool EmitAluInstruction::emit_tex_fdd(const nir_alu_instr& instr, TexInstruction auto src = vec_from_nir_with_fetch_constant(instr.src[0].src, (1 << ncomp) - 1, {0,1,2,3}); - if (instr.src[0].abs || instr.src[0].negate) - split_alu_modifiers(instr.src[0], src.values(), ncomp); + + if (instr.src[0].abs || instr.src[0].negate) { + GPRVector tmp = get_temp_vec4(); + split_alu_modifiers(instr.src[0], src.values(), tmp.values(), ncomp); + src = tmp; + } for (int i = 0; i < 4; ++i) { writemask[i] = (instr.dest.write_mask & (1 << i)) ? i : 7; diff --git a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h index 9e875b6db9a..7cbdcfd5d5c 100644 --- a/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h +++ b/src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h @@ -100,7 +100,8 @@ private: private: void make_last(AluInstruction *ir) const; - void split_alu_modifiers(const nir_alu_src &src, GPRVector::Values& v, int ncomp); + void split_alu_modifiers(const nir_alu_src &src, const GPRVector::Values& v, + GPRVector::Values& out, int ncomp); void preload_src(const nir_alu_instr& instr); unsigned num_src_comp(const nir_alu_instr& instr);