summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGert Wollny <gert.wollny@collabora.com>2020-08-02 20:50:33 +0200
committerMarge Bot <eric+marge@anholt.net>2020-09-16 08:30:41 +0000
commitdfa45e26e21bb30885bc190b3be7a4e0affc0cbe (patch)
tree758f94d7e29d359cec98ce5a61f1593b049d94ab
parente85c0bdda552bebfd2ca82c475d03132cf72b67a (diff)
r600/sfn: Fix split_alu_modifiers
Don't reuse the dest register so we can better track instruction dependencies later. Signed-off-by: Gert Wollny <gert.wollny@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6706>
-rw-r--r--src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.cpp12
-rw-r--r--src/gallium/drivers/r600/sfn/sfn_emitaluinstruction.h3
2 files changed, 10 insertions, 5 deletions
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);