shader-packing
[mesa.git] / src / gallium / drivers / nouveau / codegen / nv50_ir_print.cpp
index 7fdbafa8c700fc0cdce1e7c5c18272b3d2d7a7e3..5dcbf3c3e0c2449682dabb3489db5076ae0408cb 100644 (file)
@@ -23,7 +23,6 @@
 #include "codegen/nv50_ir.h"
 #include "codegen/nv50_ir_target.h"
 
-#define __STDC_FORMAT_MACROS
 #include <inttypes.h>
 
 namespace nv50_ir {
@@ -86,6 +85,8 @@ const char *operationStr[OP_LAST + 1] =
    "mad",
    "fma",
    "sad",
+   "shladd",
+   "xmad",
    "abs",
    "neg",
    "not",
@@ -210,6 +211,41 @@ static const char *subfmOpStr[] =
    "", "3d"
 };
 
+static const char *shflOpStr[] =
+{
+  "idx", "up", "down", "bfly"
+};
+
+static const char *pixldOpStr[] =
+{
+   "count", "covmask", "covered", "offset", "cent_offset", "sampleid"
+};
+
+static const char *rcprsqOpStr[] =
+{
+   "", "64h"
+};
+
+static const char *emitOpStr[] =
+{
+   "", "restart"
+};
+
+static const char *cctlOpStr[] =
+{
+   "", "", "", "", "", "iv", "ivall"
+};
+
+static const char *barOpStr[] =
+{
+   "sync", "arrive", "red and", "red or", "red popc"
+};
+
+static const char *xmadOpCModeStr[] =
+{
+   "clo", "chi", "csfu", "cbcc"
+};
+
 static const char *DataTypeStr[] =
 {
    "-",
@@ -276,6 +312,7 @@ static const char *SemanticStr[SV_LAST + 1] =
    "TESS_INNER",
    "TESS_COORD",
    "TID",
+   "COMBINED_TID",
    "CTAID",
    "NTID",
    "GRIDID",
@@ -289,6 +326,15 @@ static const char *SemanticStr[SV_LAST + 1] =
    "VERTEX_STRIDE",
    "INVOCATION_INFO",
    "THREAD_KILL",
+   "BASEVERTEX",
+   "BASEINSTANCE",
+   "DRAWID",
+   "WORK_DIM",
+   "LANEMASK_EQ",
+   "LANEMASK_LT",
+   "LANEMASK_LE",
+   "LANEMASK_GT",
+   "LANEMASK_GE",
    "?",
    "(INVALID)"
 };
@@ -313,6 +359,31 @@ static const char *interpStr[16] =
    "samp sc"
 };
 
+static const char *texMaskStr[16] =
+{
+   "____",
+   "r___",
+   "_g__",
+   "rg__",
+   "__b_",
+   "r_b_",
+   "_gb_",
+   "rgb_",
+   "___a",
+   "r__a",
+   "_g_a",
+   "rg_a",
+   "__ba",
+   "r_ba",
+   "_gba",
+   "rgba",
+};
+
+static const char *gatherCompStr[4] =
+{
+   "r", "g", "b", "a",
+};
+
 #define PRINT(args...)                                \
    do {                                               \
       pos += snprintf(&buf[pos], size - pos, args);   \
@@ -541,24 +612,66 @@ void Instruction::print() const
       if (asFlow()->target.bb)
          PRINT(" %sBB:%i", colour[TXT_BRA], asFlow()->target.bb->getId());
    } else {
-      PRINT("%s ", operationStr[op]);
+      if (asTex())
+         PRINT("%s%s ", operationStr[op], asTex()->tex.scalar ? "s" : "");
+      else
+         PRINT("%s ", operationStr[op]);
       if (op == OP_LINTERP || op == OP_PINTERP)
          PRINT("%s ", interpStr[ipa]);
       switch (op) {
       case OP_SUREDP:
+      case OP_SUREDB:
       case OP_ATOM:
-         if (subOp < Elements(atomSubOpStr))
+         if (subOp < ARRAY_SIZE(atomSubOpStr))
             PRINT("%s ", atomSubOpStr[subOp]);
          break;
       case OP_LOAD:
       case OP_STORE:
-         if (subOp < Elements(ldstSubOpStr))
+         if (subOp < ARRAY_SIZE(ldstSubOpStr))
             PRINT("%s ", ldstSubOpStr[subOp]);
          break;
       case OP_SUBFM:
-         if (subOp < Elements(subfmOpStr))
+         if (subOp < ARRAY_SIZE(subfmOpStr))
             PRINT("%s ", subfmOpStr[subOp]);
          break;
+      case OP_SHFL:
+         if (subOp < ARRAY_SIZE(shflOpStr))
+            PRINT("%s ", shflOpStr[subOp]);
+         break;
+      case OP_PIXLD:
+         if (subOp < ARRAY_SIZE(pixldOpStr))
+            PRINT("%s ", pixldOpStr[subOp]);
+         break;
+      case OP_RCP:
+      case OP_RSQ:
+         if (subOp < ARRAY_SIZE(rcprsqOpStr))
+            PRINT("%s ", rcprsqOpStr[subOp]);
+         break;
+      case OP_EMIT:
+         if (subOp < ARRAY_SIZE(emitOpStr))
+            PRINT("%s ", emitOpStr[subOp]);
+         break;
+      case OP_CCTL:
+         if (subOp < ARRAY_SIZE(cctlOpStr))
+            PRINT("%s ", cctlOpStr[subOp]);
+         break;
+      case OP_BAR:
+         if (subOp < ARRAY_SIZE(barOpStr))
+            PRINT("%s ", barOpStr[subOp]);
+         break;
+      case OP_XMAD: {
+         if (subOp & NV50_IR_SUBOP_XMAD_PSL)
+            PRINT("psl ");
+         if (subOp & NV50_IR_SUBOP_XMAD_MRG)
+            PRINT("mrg ");
+         unsigned cmode = (subOp & NV50_IR_SUBOP_XMAD_CMODE_MASK);
+         cmode >>= NV50_IR_SUBOP_XMAD_CMODE_SHIFT;
+         if (cmode && cmode <= ARRAY_SIZE(xmadOpCModeStr))
+            PRINT("%s ", xmadOpCModeStr[cmode - 1]);
+         for (int i = 0; i < 2; i++)
+            PRINT("h%d ", (subOp & NV50_IR_SUBOP_XMAD_H1(i)) ? 1 : 0);
+         break;
+      }
       default:
          if (subOp)
             PRINT("(SUBOP:%u) ", subOp);
@@ -566,10 +679,14 @@ void Instruction::print() const
       }
       if (perPatch)
          PRINT("patch ");
-      if (asTex())
-         PRINT("%s %s$r%u $s%u %s", asTex()->tex.target.getName(),
-               colour[TXT_MEM], asTex()->tex.r, asTex()->tex.s,
-               colour[TXT_INSN]);
+      if (asTex()) {
+         PRINT("%s %s$r%u $s%u ", asTex()->tex.target.getName(),
+               colour[TXT_MEM], asTex()->tex.r, asTex()->tex.s);
+         if (op == OP_TXG)
+            PRINT("%s ", gatherCompStr[asTex()->tex.gatherComp]);
+         PRINT("%s %s", texMaskStr[asTex()->tex.mask], colour[TXT_INSN]);
+      }
+
       if (postFactor)
          PRINT("x2^%i ", postFactor);
       PRINT("%s%s", dnz ? "dnz " : (ftz ? "ftz " : ""),  DataTypeStr[dType]);
@@ -624,7 +741,7 @@ void Instruction::print() const
 class PrintPass : public Pass
 {
 public:
-   PrintPass() : serial(0) { }
+   PrintPass(bool omitLineNum) : serial(0), omit_serial(omitLineNum) { }
 
    virtual bool visit(Function *);
    virtual bool visit(BasicBlock *);
@@ -632,6 +749,7 @@ public:
 
 private:
    int serial;
+   bool omit_serial;
 };
 
 bool
@@ -695,7 +813,11 @@ PrintPass::visit(BasicBlock *bb)
 bool
 PrintPass::visit(Instruction *insn)
 {
-   INFO("%3i: ", serial++);
+   if (omit_serial)
+      INFO("     ");
+   else
+      INFO("%3i: ", serial);
+   serial++;
    insn->print();
    return true;
 }
@@ -703,14 +825,14 @@ PrintPass::visit(Instruction *insn)
 void
 Function::print()
 {
-   PrintPass pass;
+   PrintPass pass(prog->driver->omitLineNum);
    pass.run(this, true, false);
 }
 
 void
 Program::print()
 {
-   PrintPass pass;
+   PrintPass pass(driver->omitLineNum);
    init_colours();
    pass.run(this, true, false);
 }