From 83bb5dee16da55c890e78d906e286977b0dc5552 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Fri, 15 Jan 2021 17:01:27 -0500 Subject: [PATCH] nv50/ir: clear dnz flag when converting mul/mad to simpler ops Fixes some assertion failures in the GM107 emitter with the game 'tansei', noticed while debugging gitlab issue 4101. Signed-off-by: Ilia Mirkin Reviewed-by: Karol Herbst Part-of: (cherry picked from commit 6638b58ccf17ce3a00a8ecbf5f39b5bedef238ed) --- .pick_status.json | 2 +- src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 370dd24bfc0..ddfa31762d9 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1795,7 +1795,7 @@ "description": "nv50/ir: clear dnz flag when converting mul/mad to simpler ops", "nominated": false, "nomination_type": null, - "resolution": 4, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index 2d32067729d..f5514c6f5fd 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -1108,6 +1108,7 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s) } } else if (imm0.isInteger(0)) { + i->dnz = 0; i->op = OP_MOV; i->setSrc(0, new_ImmediateValue(prog, 0u)); i->src(0).mod = Modifier(0); @@ -1117,6 +1118,7 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s) if (!i->postFactor && (imm0.isInteger(1) || imm0.isInteger(-1))) { if (imm0.isNegative()) i->src(t).mod = i->src(t).mod ^ Modifier(NV50_IR_MOD_NEG); + i->dnz = 0; i->op = i->src(t).mod.getOp(); if (s == 0) { i->setSrc(0, i->getSrc(1)); @@ -1157,6 +1159,7 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s) i->src(0).mod = i->src(2).mod; i->setSrc(1, NULL); i->setSrc(2, NULL); + i->dnz = 0; i->op = i->src(0).mod.getOp(); if (i->op != OP_CVT) i->src(0).mod = 0;