"fma",
"sad",
"shladd",
+ "xmad",
"abs",
"neg",
"not",
"sync", "arrive", "red and", "red or", "red popc"
};
+static const char *xmadOpCModeStr[] =
+{
+ "clo", "chi", "csfu", "cbcc"
+};
+
static const char *DataTypeStr[] =
{
"-",
"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); \
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) {
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);
}
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]);