nv50/ir: make sure to fetch all sources before creating instruction
authorIlia Mirkin <imirkin@alum.mit.edu>
Wed, 3 Feb 2016 23:16:04 +0000 (18:16 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Wed, 3 Feb 2016 23:40:38 +0000 (18:40 -0500)
We must fetch all sources into the instruction stream before generating
the instruction that uses them. Otherwise we'll define values after
using them, which won't work so well.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Tested-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp

index 3da6099b5ff228f0f770dbe5f47ea40a753b6479..52ac198221d886a9f4e3a26d7fd490229798e62d 100644 (file)
@@ -2428,19 +2428,22 @@ Converter::handleATOM(Value *dst0[4], DataType ty, uint16_t subOp)
             continue;
 
          Instruction *insn;
-         Value *off = fetchSrc(1, c);
+         Value *off = fetchSrc(1, c), *off2 = NULL;
          Value *sym;
          if (tgsi.getSrc(1).getFile() == TGSI_FILE_IMMEDIATE)
             sym = makeSym(TGSI_FILE_BUFFER, r, -1, c, tgsi.getSrc(1).getValueU32(c, info));
          else
             sym = makeSym(TGSI_FILE_BUFFER, r, -1, c, 0);
-         insn = mkOp2(OP_ATOM, ty, dst, sym, fetchSrc(2, c));
+         if (tgsi.getSrc(0).isIndirect(0))
+            off2 = fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0);
          if (subOp == NV50_IR_SUBOP_ATOM_CAS)
-            insn->setSrc(2, fetchSrc(3, 0));
+            insn = mkOp3(OP_ATOM, ty, dst, sym, fetchSrc(2, c), fetchSrc(3, c));
+         else
+            insn = mkOp2(OP_ATOM, ty, dst, sym, fetchSrc(2, c));
          if (tgsi.getSrc(1).getFile() != TGSI_FILE_IMMEDIATE)
             insn->setIndirect(0, 0, off);
-         if (tgsi.getSrc(0).isIndirect(0))
-            insn->setIndirect(0, 1, fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0));
+         if (off2)
+            insn->setIndirect(0, 1, off2);
          insn->subOp = subOp;
       }
       for (int c = 0; c < 4; ++c)