From ee28cae1ef1cf0d965e7cafe3fc3be1e83736bfb Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Mon, 15 Feb 2021 12:22:02 -0500 Subject: [PATCH] nv50/ir: fix emission of RED When the atomic result is unused, the opcode form needs to be a bit different. Signed-off-by: Ilia Mirkin Acked-by: Pierre Moreau Part-of: --- .../nouveau/codegen/nv50_ir_emit_nv50.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp index 8c5646cd168..5143950f430 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp @@ -1824,19 +1824,28 @@ CodeEmitterNV50::emitATOM(const Instruction *i) return; } code[0] = 0xd0000001; - code[1] = 0xe0c00000 | (subOp << 2); + code[1] = 0xc0c00000 | (subOp << 2); if (isSignedType(i->dType)) code[1] |= 1 << 21; // args emitFlagsRd(i); - setDst(i, 0); - setSrc(i, 1, 1); + if (i->subOp == NV50_IR_SUBOP_ATOM_EXCH || + i->subOp == NV50_IR_SUBOP_ATOM_CAS || + i->defExists(0)) { + code[1] |= 0x20000000; + setDst(i, 0); + setSrc(i, 1, 1); + // g[] pointer + code[0] |= i->getSrc(0)->reg.fileIndex << 23; + } else { + srcId(i->src(1), 2); + // g[] pointer + code[0] |= i->getSrc(0)->reg.fileIndex << 16; + } if (i->subOp == NV50_IR_SUBOP_ATOM_CAS) setSrc(i, 2, 2); - // g[] pointer - code[0] |= i->getSrc(0)->reg.fileIndex << 23; srcId(i->getIndirect(0, 0), 9); }