shader-packing
[mesa.git] / src / gallium / drivers / nouveau / codegen / nv50_ir_print.cpp
index 1415eb5d209bbbab54e969e4ace88898e2e5ff88..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",
@@ -135,6 +136,7 @@ const char *operationStr[OP_LAST + 1] =
    "membar",
    "vfetch",
    "pfetch",
+   "afetch",
    "export",
    "linterp",
    "pinterp",
@@ -160,18 +162,21 @@ const char *operationStr[OP_LAST + 1] =
    "subfm",
    "suclamp",
    "sueau",
+   "suq",
    "madsp",
    "texbar",
    "dfdx",
    "dfdy",
    "rdsv",
    "wrsv",
+   "pixld",
    "quadop",
    "quadon",
    "quadpop",
    "popcnt",
    "insbf",
    "extbf",
+   "bfind",
    "permt",
    "atom",
    "bar",
@@ -185,6 +190,9 @@ const char *operationStr[OP_LAST + 1] =
    "vshl",
    "vsel",
    "cctl",
+   "shfl",
+   "vote",
+   "bufq",
    "(invalid)"
 };
 
@@ -193,6 +201,51 @@ static const char *atomSubOpStr[] =
    "add", "min", "max", "inc", "dec", "and", "or", "xor", "cas", "exch"
 };
 
+static const char *ldstSubOpStr[] =
+{
+   "", "lock", "unlock"
+};
+
+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[] =
 {
    "-",
@@ -254,9 +307,12 @@ static const char *SemanticStr[SV_LAST + 1] =
    "CLIP_DISTANCE",
    "SAMPLE_INDEX",
    "SAMPLE_POS",
-   "TESS_FACTOR",
+   "SAMPLE_MASK",
+   "TESS_OUTER",
+   "TESS_INNER",
    "TESS_COORD",
    "TID",
+   "COMBINED_TID",
    "CTAID",
    "NTID",
    "GRIDID",
@@ -268,6 +324,17 @@ static const char *SemanticStr[SV_LAST + 1] =
    "LBASE",
    "SBASE",
    "VERTEX_STRIDE",
+   "INVOCATION_INFO",
+   "THREAD_KILL",
+   "BASEVERTEX",
+   "BASEINSTANCE",
+   "DRAWID",
+   "WORK_DIM",
+   "LANEMASK_EQ",
+   "LANEMASK_LT",
+   "LANEMASK_LE",
+   "LANEMASK_GT",
+   "LANEMASK_GE",
    "?",
    "(INVALID)"
 };
@@ -292,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);   \
@@ -404,7 +496,7 @@ int ImmediateValue::print(char *buf, size_t size, DataType ty) const
    case TYPE_U64:
    case TYPE_S64:
    default:
-      PRINT("0x%016"PRIx64, reg.data.u64);
+      PRINT("0x%016" PRIx64, reg.data.u64);
       break;
    }
    return pos;
@@ -440,6 +532,7 @@ int Symbol::print(char *buf, size_t size,
    case FILE_MEMORY_CONST:  c = 'c'; break;
    case FILE_SHADER_INPUT:  c = 'a'; break;
    case FILE_SHADER_OUTPUT: c = 'o'; break;
+   case FILE_MEMORY_BUFFER: c = 'b'; break; // Only used before lowering
    case FILE_MEMORY_GLOBAL: c = 'g'; break;
    case FILE_MEMORY_SHARED: c = 's'; break;
    case FILE_MEMORY_LOCAL:  c = 'l'; break;
@@ -519,15 +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 < ARRAY_SIZE(ldstSubOpStr))
+            PRINT("%s ", ldstSubOpStr[subOp]);
+         break;
+      case OP_SUBFM:
+         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);
@@ -535,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]);
@@ -593,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 *);
@@ -601,6 +749,7 @@ public:
 
 private:
    int serial;
+   bool omit_serial;
 };
 
 bool
@@ -664,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;
 }
@@ -672,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);
 }