nv50/ir: fix emission of ld/st lock/unlock
authorIlia Mirkin <imirkin@alum.mit.edu>
Mon, 1 Mar 2021 23:59:27 +0000 (18:59 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sun, 11 Apr 2021 16:31:22 +0000 (12:31 -0400)
This is necessary to implement shared atomics.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Acked-by: Pierre Moreau <dev@pmoreau.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9299>

src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp

index 18d6541..64d64b9 100644 (file)
@@ -644,6 +644,9 @@ CodeEmitterNV50::emitLOAD(const Instruction *i)
             code[1] |= 0x04000000;
 
          emitLoadStoreSizeCS(i->sType);
+
+         if (i->subOp == NV50_IR_SUBOP_LOAD_LOCKED)
+            code[1] |= 0x00800000;
       } else {
          assert(offset <= (int32_t)(0x1f * typeSizeof(i->sType)));
          code[0] = 0x10000001;
@@ -714,6 +717,8 @@ CodeEmitterNV50::emitSTORE(const Instruction *i)
    case FILE_MEMORY_SHARED:
       code[0] = 0x00000001;
       code[1] = 0xe0000000;
+      if (i->subOp == NV50_IR_SUBOP_STORE_UNLOCKED)
+         code[1] |= 0x00800000;
       switch (typeSizeof(i->dType)) {
       case 1:
          code[0] |= offset << 9;