13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**************************************************************************
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * All Rights Reserved.
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * "Software"), to deal in the Software without restriction, including
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * permit persons to whom the Software is furnished to do so, subject to
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the following conditions:
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * next paragraph) shall be included in all copies or substantial portions
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * of the Software.
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org **************************************************************************/
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "i915_reg.h"
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "i915_debug.h"
31760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "i915_debug_private.h"
32760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "util/u_debug.h"
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgPRINTF(
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct debug_stream  *stream,
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const char           *fmt,
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                        ... )
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   va_list  args;
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   va_start( args, fmt );
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   debug_vprintf( fmt, args );
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   va_end( args );
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic const char *opcodes[0x20] = {
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "NOP",
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "ADD",
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "MOV",
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "MUL",
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "MAD",
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "DP2ADD",
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "DP3",
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "DP4",
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "FRC",
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "RCP",
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "RSQ",
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "EXP",
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "LOG",
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "CMP",
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "MIN",
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "MAX",
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "FLR",
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "MOD",
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "TRC",
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "SGE",
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "SLT",
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "TEXLD",
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "TEXLDP",
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "TEXLDB",
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "TEXKILL",
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "DCL",
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "0x1a",
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "0x1b",
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "0x1c",
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "0x1d",
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "0x1e",
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "0x1f",
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic const int args[0x20] = {
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   0,                           /* 0 nop */
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   2,                           /* 1 add */
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,                           /* 2 mov */
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   2,                           /* 3 m ul */
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   3,                           /* 4 mad */
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   3,                           /* 5 dp2add */
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   2,                           /* 6 dp3 */
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   2,                           /* 7 dp4 */
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,                           /* 8 frc */
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,                           /* 9 rcp */
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,                           /* a rsq */
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,                           /* b exp */
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,                           /* c log */
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   3,                           /* d cmp */
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   2,                           /* e min */
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   2,                           /* f max */
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,                           /* 10 flr */
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,                           /* 11 mod */
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,                           /* 12 trc */
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   2,                           /* 13 sge */
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   2,                           /* 14 slt */
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   1,
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   0,
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   0,
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   0,
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   0,
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   0,
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   0,
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   0,
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic const char *regname[0x8] = {
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "R",
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "T",
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "CONST",
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "S",
1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "OC",
1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "OD",
1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "U",
1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "UNKNOWN",
1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgprint_reg_type_nr(struct debug_stream *stream, unsigned type, unsigned nr)
1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   switch (type) {
1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case REG_TYPE_T:
1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      switch (nr) {
1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case T_DIFFUSE:
1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "T_DIFFUSE");
1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         return;
1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case T_SPECULAR:
1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "T_SPECULAR");
1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         return;
1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case T_FOG_W:
1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "T_FOG_W");
1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         return;
1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      default:
1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "T_TEX%d", nr);
1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         return;
1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case REG_TYPE_OC:
1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (nr == 0) {
1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "oC");
1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         return;
1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case REG_TYPE_OD:
1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (nr == 0) {
1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "oD");
1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         return;
1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   default:
1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "%s[%d]", regname[type], nr);
1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define REG_SWIZZLE_MASK 0x7777
1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define REG_NEGATE_MASK 0x8888
1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define REG_SWIZZLE_XYZW ((SRC_X << A2_SRC2_CHANNEL_X_SHIFT) |	\
1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		      (SRC_Y << A2_SRC2_CHANNEL_Y_SHIFT) |	\
1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		      (SRC_Z << A2_SRC2_CHANNEL_Z_SHIFT) |	\
1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		      (SRC_W << A2_SRC2_CHANNEL_W_SHIFT))
1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgprint_reg_neg_swizzle(struct debug_stream *stream, unsigned reg)
1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i;
1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if ((reg & REG_SWIZZLE_MASK) == REG_SWIZZLE_XYZW &&
1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       (reg & REG_NEGATE_MASK) == 0)
1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, ".");
1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 3; i >= 0; i--) {
1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (reg & (1 << ((i * 4) + 3)))
1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "-");
1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      switch ((reg >> (i * 4)) & 0x7) {
1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case 0:
1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "x");
1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case 1:
1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "y");
2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case 2:
2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "z");
2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case 3:
2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "w");
2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case 4:
2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "0");
2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case 5:
2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "1");
2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      default:
2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "?");
2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         break;
2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgprint_src_reg(struct debug_stream *stream, unsigned dword)
2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned nr = (dword >> A2_SRC2_NR_SHIFT) & REG_NR_MASK;
2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned type = (dword >> A2_SRC2_TYPE_SHIFT) & REG_TYPE_MASK;
2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_reg_type_nr(stream, type, nr);
2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_reg_neg_swizzle(stream, dword);
2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgprint_dest_reg(struct debug_stream *stream, unsigned dword)
2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned nr = (dword >> A0_DEST_NR_SHIFT) & REG_NR_MASK;
2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned type = (dword >> A0_DEST_TYPE_SHIFT) & REG_TYPE_MASK;
2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_reg_type_nr(stream, type, nr);
2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if ((dword & A0_DEST_CHANNEL_ALL) == A0_DEST_CHANNEL_ALL)
2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, ".");
2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (dword & A0_DEST_CHANNEL_X)
2413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      PRINTF(stream, "x");
2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (dword & A0_DEST_CHANNEL_Y)
2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      PRINTF(stream, "y");
2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (dword & A0_DEST_CHANNEL_Z)
2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      PRINTF(stream, "z");
2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (dword & A0_DEST_CHANNEL_W)
2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      PRINTF(stream, "w");
2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define GET_SRC0_REG(r0, r1) ((r0<<14)|(r1>>A1_SRC0_CHANNEL_W_SHIFT))
2523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define GET_SRC1_REG(r0, r1) ((r0<<8)|(r1>>A2_SRC1_CHANNEL_W_SHIFT))
2533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define GET_SRC2_REG(r)      (r)
2543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
2573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgprint_arith_op(struct debug_stream *stream,
2583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	       unsigned opcode, const unsigned * program)
2593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (opcode != A0_NOP) {
2613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      print_dest_reg(stream, program[0]);
2623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (program[0] & A0_DEST_SATURATE)
2633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, " = SATURATE ");
2643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else
2653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, " = ");
2663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "%s ", opcodes[opcode]);
2693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_src_reg(stream, GET_SRC0_REG(program[0], program[1]));
2713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (args[opcode] == 1) {
2723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      PRINTF(stream, "\n");
2733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
2743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, ", ");
2773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_src_reg(stream, GET_SRC1_REG(program[1], program[2]));
2783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (args[opcode] == 2) {
2793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      PRINTF(stream, "\n");
2803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return;
2813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, ", ");
2843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_src_reg(stream, GET_SRC2_REG(program[2]));
2853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "\n");
2863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return;
2873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
2913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgprint_tex_op(struct debug_stream *stream,
2923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	     unsigned opcode, const unsigned * program)
2933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_dest_reg(stream, program[0] | A0_DEST_CHANNEL_ALL);
2953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, " = ");
2963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "%s ", opcodes[opcode]);
2983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "S[%d],", program[0] & T0_SAMPLER_NR_MASK);
3003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_reg_type_nr(stream,
3023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		     (program[1] >> T1_ADDRESS_REG_TYPE_SHIFT) &
3033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                     REG_TYPE_MASK,
3043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                     (program[1] >> T1_ADDRESS_REG_NR_SHIFT) & REG_NR_MASK);
3053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "\n");
3063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
3093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgprint_texkil_op(struct debug_stream *stream,
3103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                unsigned opcode, const unsigned * program)
3113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "TEXKIL ");
3133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_reg_type_nr(stream,
3153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		     (program[1] >> T1_ADDRESS_REG_TYPE_SHIFT) &
3163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                     REG_TYPE_MASK,
3173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                     (program[1] >> T1_ADDRESS_REG_NR_SHIFT) & REG_NR_MASK);
3183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "\n");
3193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
3223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgprint_dcl_op(struct debug_stream *stream,
3233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	     unsigned opcode, const unsigned * program)
3243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "%s ", opcodes[opcode]);
3263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_dest_reg(stream,
3273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		  program[0] | A0_DEST_CHANNEL_ALL);
3283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "\n");
3293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid
3333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgi915_disassemble_program(struct debug_stream *stream,
3343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			 const unsigned * program, unsigned sz)
3353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned i;
3373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "\t\tBEGIN\n");
3393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   assert((program[0] & 0x1ff) + 2 == sz);
3413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   program++;
3433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 1; i < sz; i += 3, program += 3) {
3443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      unsigned opcode = program[0] & (0x1f << 24);
3453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      PRINTF(stream, "\t\t");
3473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if ((int) opcode >= A0_NOP && opcode <= A0_SLT)
3493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         print_arith_op(stream, opcode >> 24, program);
3503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else if (opcode >= T0_TEXLD && opcode < T0_TEXKILL)
3513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         print_tex_op(stream, opcode >> 24, program);
3523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else if (opcode == T0_TEXKILL)
3533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         print_texkil_op(stream, opcode >> 24, program);
3543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else if (opcode == D0_DCL)
3553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         print_dcl_op(stream, opcode >> 24, program);
3563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else
3573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         PRINTF(stream, "Unknown opcode 0x%x\n", opcode);
3583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   PRINTF(stream, "\t\tEND\n\n");
3613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
364