14a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell/**************************************************************************
24a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell *
34a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
44a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * All Rights Reserved.
54a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell *
64a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
74a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * copy of this software and associated documentation files (the
84a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * "Software"), to deal in the Software without restriction, including
94a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
104a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
114a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to
124a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * the following conditions:
134a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell *
144a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * The above copyright notice and this permission notice (including the
154a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * next paragraph) shall be included in all copies or substantial portions
164a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * of the Software.
174a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell *
184a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
194a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
204a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
214a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
224a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
234a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
244a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
254a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell *
264a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell **************************************************************************/
274a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
284a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#include <stdio.h>
294a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
304a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#include "i915_reg.h"
314a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#include "i915_debug.h"
32c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell#include "main/imports.h"
334a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
344a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic const char *opcodes[0x20] = {
354a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "NOP",
364a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "ADD",
374a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "MOV",
384a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "MUL",
394a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "MAD",
404a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "DP2ADD",
414a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "DP3",
424a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "DP4",
434a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "FRC",
444a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "RCP",
454a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "RSQ",
464a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "EXP",
474a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "LOG",
484a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "CMP",
494a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "MIN",
504a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "MAX",
514a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "FLR",
524a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "MOD",
534a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "TRC",
544a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "SGE",
554a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "SLT",
564a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "TEXLD",
574a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "TEXLDP",
584a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "TEXLDB",
594a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "TEXKILL",
604a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "DCL",
614a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "0x1a",
624a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "0x1b",
634a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "0x1c",
644a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "0x1d",
654a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "0x1e",
664a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "0x1f",
674a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell};
684a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
694a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
704a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic const int args[0x20] = {
714a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   0,                           /* 0 nop */
724a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   2,                           /* 1 add */
734a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,                           /* 2 mov */
744a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   2,                           /* 3 m ul */
754a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   3,                           /* 4 mad */
764a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   3,                           /* 5 dp2add */
774a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   2,                           /* 6 dp3 */
784a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   2,                           /* 7 dp4 */
794a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,                           /* 8 frc */
804a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,                           /* 9 rcp */
814a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,                           /* a rsq */
824a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,                           /* b exp */
834a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,                           /* c log */
844a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   3,                           /* d cmp */
854a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   2,                           /* e min */
864a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   2,                           /* f max */
874a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,                           /* 10 flr */
884a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,                           /* 11 mod */
894a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,                           /* 12 trc */
904a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   2,                           /* 13 sge */
914a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   2,                           /* 14 slt */
924a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,
934a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,
944a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,
954a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   1,
964a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   0,
974a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   0,
984a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   0,
994a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   0,
1004a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   0,
1014a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   0,
1024a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   0,
1034a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell};
1044a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1054a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1064a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic const char *regname[0x8] = {
1074a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "R",
1084a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "T",
1094a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "CONST",
1104a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "S",
1114a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "OC",
1124a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "OD",
1134a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "U",
1144a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   "UNKNOWN",
1154a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell};
1164a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1174a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic void
1184a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellprint_reg_type_nr(GLuint type, GLuint nr)
1194a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell{
1204a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   switch (type) {
1214a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case REG_TYPE_T:
1224a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      switch (nr) {
1234a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case T_DIFFUSE:
124298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("T_DIFFUSE");
1254a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         return;
1264a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case T_SPECULAR:
127298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("T_SPECULAR");
1284a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         return;
1294a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case T_FOG_W:
130298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("T_FOG_W");
1314a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         return;
1324a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      default:
133298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("T_TEX%d", nr);
1344a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         return;
1354a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      }
1364a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case REG_TYPE_OC:
1374a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      if (nr == 0) {
138298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("oC");
1394a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         return;
1404a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      }
1414a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      break;
1424a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case REG_TYPE_OD:
1434a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      if (nr == 0) {
144298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("oD");
1454a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         return;
1464a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      }
1474a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      break;
1484a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   default:
1494a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      break;
1504a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
1514a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
152298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s[%d]", regname[type], nr);
1534a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
1544a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1554a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#define REG_SWIZZLE_MASK 0x7777
1564a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#define REG_NEGATE_MASK 0x8888
1574a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1584a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#define REG_SWIZZLE_XYZW ((SRC_X << A2_SRC2_CHANNEL_X_SHIFT) |	\
1594a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell		      (SRC_Y << A2_SRC2_CHANNEL_Y_SHIFT) |	\
1604a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell		      (SRC_Z << A2_SRC2_CHANNEL_Z_SHIFT) |	\
1614a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell		      (SRC_W << A2_SRC2_CHANNEL_W_SHIFT))
1624a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1634a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1644a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic void
1654a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellprint_reg_neg_swizzle(GLuint reg)
1664a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell{
1674a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   int i;
1684a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1694a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if ((reg & REG_SWIZZLE_MASK) == REG_SWIZZLE_XYZW &&
1704a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell       (reg & REG_NEGATE_MASK) == 0)
1714a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      return;
1724a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
173298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf(".");
1744a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1754a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   for (i = 3; i >= 0; i--) {
1764a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      if (reg & (1 << ((i * 4) + 3)))
177298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("-");
1784a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1794a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      switch ((reg >> (i * 4)) & 0x7) {
1804a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0:
181298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("x");
1824a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         break;
1834a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 1:
184298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("y");
1854a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         break;
1864a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 2:
187298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("z");
1884a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         break;
1894a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 3:
190298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("w");
1914a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         break;
1924a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 4:
193298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("0");
1944a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         break;
1954a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 5:
196298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("1");
1974a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         break;
1984a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      default:
199298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("?");
2004a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         break;
2014a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      }
2024a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
2034a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
2044a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2054a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2064a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic void
2074a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellprint_src_reg(GLuint dword)
2084a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell{
2094a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint nr = (dword >> A2_SRC2_NR_SHIFT) & REG_NR_MASK;
2104a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint type = (dword >> A2_SRC2_TYPE_SHIFT) & REG_TYPE_MASK;
2114a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   print_reg_type_nr(type, nr);
2124a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   print_reg_neg_swizzle(dword);
2134a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
2144a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2154a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2164a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic void
2174a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellprint_dest_reg(GLuint dword)
2184a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell{
2194a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint nr = (dword >> A0_DEST_NR_SHIFT) & REG_NR_MASK;
2204a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint type = (dword >> A0_DEST_TYPE_SHIFT) & REG_TYPE_MASK;
2214a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   print_reg_type_nr(type, nr);
2224a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if ((dword & A0_DEST_CHANNEL_ALL) == A0_DEST_CHANNEL_ALL)
2234a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      return;
224298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf(".");
2254a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (dword & A0_DEST_CHANNEL_X)
226298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("x");
2274a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (dword & A0_DEST_CHANNEL_Y)
228298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("y");
2294a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (dword & A0_DEST_CHANNEL_Z)
230298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("z");
2314a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (dword & A0_DEST_CHANNEL_W)
232298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("w");
2334a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
2344a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2354a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2364a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#define GET_SRC0_REG(r0, r1) ((r0<<14)|(r1>>A1_SRC0_CHANNEL_W_SHIFT))
2374a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#define GET_SRC1_REG(r0, r1) ((r0<<8)|(r1>>A2_SRC1_CHANNEL_W_SHIFT))
2384a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#define GET_SRC2_REG(r)      (r)
2394a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2404a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2414a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic void
2424a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellprint_arith_op(GLuint opcode, const GLuint * program)
2434a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell{
2444a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (opcode != A0_NOP) {
2454a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      print_dest_reg(program[0]);
2464a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      if (program[0] & A0_DEST_SATURATE)
247298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf(" = SATURATE ");
2484a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      else
249298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf(" = ");
2504a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
2514a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
252298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s ", opcodes[opcode]);
2534a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2544a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   print_src_reg(GET_SRC0_REG(program[0], program[1]));
2554a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (args[opcode] == 1) {
256298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\n");
2574a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      return;
2584a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
2594a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
260298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf(", ");
2614a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   print_src_reg(GET_SRC1_REG(program[1], program[2]));
2624a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (args[opcode] == 2) {
263298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\n");
2644a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      return;
2654a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
2664a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
267298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf(", ");
2684a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   print_src_reg(GET_SRC2_REG(program[2]));
269298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\n");
2704a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   return;
2714a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
2724a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2734a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2744a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic void
2754a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellprint_tex_op(GLuint opcode, const GLuint * program)
2764a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell{
2774a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   print_dest_reg(program[0] | A0_DEST_CHANNEL_ALL);
278298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf(" = ");
2794a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
280298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s ", opcodes[opcode]);
2814a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("S[%d],", program[0] & T0_SAMPLER_NR_MASK);
2834a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2844a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   print_reg_type_nr((program[1] >> T1_ADDRESS_REG_TYPE_SHIFT) &
2854a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell                     REG_TYPE_MASK,
2864a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell                     (program[1] >> T1_ADDRESS_REG_NR_SHIFT) & REG_NR_MASK);
287298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\n");
2884a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
2894a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2904a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic void
2914a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellprint_dcl_op(GLuint opcode, const GLuint * program)
2924a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell{
293298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s ", opcodes[opcode]);
2944a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   print_dest_reg(program[0] | A0_DEST_CHANNEL_ALL);
295298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\n");
2964a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
2974a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2984a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
2994a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellvoid
3004a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwelli915_disassemble_program(const GLuint * program, GLuint sz)
3014a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell{
3024a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint size = program[0] & 0x1ff;
3034a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLint i;
3044a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
305298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t\tBEGIN\n");
3064a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3074a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   assert(size + 2 == sz);
3084a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3094a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   program++;
3104a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   for (i = 1; i < sz; i += 3, program += 3) {
3114a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      GLuint opcode = program[0] & (0x1f << 24);
3124a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
313298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t\t");
3144a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3154a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      if ((GLint) opcode >= A0_NOP && opcode <= A0_SLT)
3164a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         print_arith_op(opcode >> 24, program);
3174a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      else if (opcode >= T0_TEXLD && opcode <= T0_TEXKILL)
3184a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         print_tex_op(opcode >> 24, program);
3194a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      else if (opcode == D0_DCL)
3204a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell         print_dcl_op(opcode >> 24, program);
3214a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      else
322298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg         printf("Unknown opcode 0x%x\n", opcode);
3234a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
3244a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
325298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t\tEND\n\n");
3264a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
3274a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3284a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
329