Mesa (master): gm107/ir: emit RED instead of ATOM when no dst

Samuel Pitoiset hakzsam at kemper.freedesktop.org
Sat Nov 5 18:29:04 UTC 2016


Module: Mesa
Branch: master
Commit: a29536459694017bf4e7424764574808553a6d7f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a29536459694017bf4e7424764574808553a6d7f

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Fri Nov  4 20:08:57 2016 +0100

gm107/ir: emit RED instead of ATOM when no dst

This is similar to NVC0 and GK110 emitters where we emit
reduction operations instead of atomic operations when the
destination is not used.

Found after writing some tests which check if performance counters
return the expected value. In that case, gred_count returned 0
on gm107 while at least gk106 returned the correct value.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>

---

 .../drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp | 29 +++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
index 5ed2ad4..5bd0fa0 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
@@ -180,6 +180,7 @@ private:
    void emitIPA();
    void emitATOM();
    void emitATOMS();
+   void emitRED();
    void emitCCTL();
 
    void emitPIXLD();
@@ -2496,6 +2497,29 @@ CodeEmitterGM107::emitATOMS()
 }
 
 void
+CodeEmitterGM107::emitRED()
+{
+   unsigned dType;
+
+   switch (insn->dType) {
+   case TYPE_U32: dType = 0; break;
+   case TYPE_S32: dType = 1; break;
+   case TYPE_U64: dType = 2; break;
+   case TYPE_F32: dType = 3; break;
+   case TYPE_B128: dType = 4; break;
+   case TYPE_S64: dType = 5; break;
+   default: assert(!"unexpected dType"); dType = 0; break;
+   }
+
+   emitInsn (0xebf80000);
+   emitField(0x30, 1, insn->src(0).getIndirect(0)->getSize() == 8);
+   emitField(0x17, 3, insn->subOp);
+   emitField(0x14, 3, dType);
+   emitADDR (0x08, 0x1c, 20, 0, insn->src(0));
+   emitGPR  (0x00, insn->src(1));
+}
+
+void
 CodeEmitterGM107::emitCCTL()
 {
    unsigned width;
@@ -3237,7 +3261,10 @@ CodeEmitterGM107::emitInstruction(Instruction *i)
       if (insn->src(0).getFile() == FILE_MEMORY_SHARED)
          emitATOMS();
       else
-         emitATOM();
+         if (!insn->defExists(0) && insn->subOp < NV50_IR_SUBOP_ATOM_CAS)
+            emitRED();
+         else
+            emitATOM();
       break;
    case OP_CCTL:
       emitCCTL();




More information about the mesa-commit mailing list