gk110/ir: allow to emit immediates for BAR
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sun, 28 Feb 2016 21:43:50 +0000 (22:43 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 7 Mar 2016 17:39:46 +0000 (18:39 +0100)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp

index 0e7a237..e5d638b 100644 (file)
@@ -1279,8 +1279,27 @@ CodeEmitterGK110::emitBAR(const Instruction *i)
 
    emitPredicate(i);
 
-   srcId(i->src(0), 10);
-   srcId(i->src(1), 23);
+   // barrier id
+   if (i->src(0).getFile() == FILE_GPR) {
+      srcId(i->src(0), 10);
+   } else {
+      ImmediateValue *imm = i->getSrc(0)->asImm();
+      assert(imm);
+      code[0] |= imm->reg.data.u32 << 10;
+      code[1] |= 0x8000;
+   }
+
+   // thread count
+   if (i->src(1).getFile() == FILE_GPR) {
+      srcId(i->src(1), 23);
+   } else {
+      ImmediateValue *imm = i->getSrc(0)->asImm();
+      assert(imm);
+      assert(imm->reg.data.u32 <= 0xfff);
+      code[0] |= imm->reg.data.u32 << 23;
+      code[1] |= imm->reg.data.u32 >> 9;
+      code[1] |= 0x4000;
+   }
 }
 
 void CodeEmitterGK110::emitMEMBAR(const Instruction *i)