nvc0/ir: allow min/max instructions to be dual-issued in pairs
authorKarol Herbst <karolherbst@gmail.com>
Sat, 13 Aug 2016 09:54:52 +0000 (11:54 +0200)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 3 Sep 2016 17:53:09 +0000 (13:53 -0400)
changes for GpuTest /test=pixmark_piano /benchmark /no_scorebox /msaa=0
/benchmark_duration_ms=60000 /width=1024 /height=640:

inst_executed: 1.03G
inst_issued1: 614M -> 580M
inst_issued2: 213M -> 230M

score: 1021 -> 1030

Signed-off-by: Karol Herbst <karolherbst@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp

index 0cb21e8c82633442fc4598037084cfe800a81dcd..f5981de2e010bff193bbf2d68a7f02cfc0d75116 100644 (file)
@@ -625,9 +625,19 @@ bool TargetNVC0::canDualIssue(const Instruction *a, const Instruction *b) const
       if (a->op == OP_MOV || b->op == OP_MOV)
          return true;
       if (clA == clB) {
-         // only F32 arith or integer additions
-         if (clA != OPCLASS_ARITH)
+         switch (clA) {
+         // there might be more
+         case OPCLASS_COMPARE:
+            if ((a->op == OP_MIN || a->op == OP_MAX) &&
+                (b->op == OP_MIN || b->op == OP_MAX))
+               break;
+            return false;
+         case OPCLASS_ARITH:
+            break;
+         default:
             return false;
+         }
+         // only F32 arith or integer additions
          return (a->dType == TYPE_F32 || a->op == OP_ADD ||
                  b->dType == TYPE_F32 || b->op == OP_ADD);
       }