i915_debug.c revision c60113cd41ac84f8737005ca1d7a1114e3725ae5
1594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell/**************************************************************************
2594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell *
3594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * All Rights Reserved.
5594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell *
6594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
7594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * copy of this software and associated documentation files (the
8594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * "Software"), to deal in the Software without restriction, including
9594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
10594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
11594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
12594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * the following conditions:
13594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell *
14594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * The above copyright notice and this permission notice (including the
15594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
16594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * of the Software.
17594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell *
18594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell *
26594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell **************************************************************************/
27594c3f67ac8fceb061e47b090ec4d149c55a1940Keith Whitwell
2841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell#include "i915_reg.h"
2941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell#include "i915_context.h"
3041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell#include <stdio.h>
3141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
3241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
3341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic const char *opcodes[0x20] = {
3441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "NOP",
3541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "ADD",
3641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "MOV",
3741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "MUL",
3841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "MAD",
3941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "DP2ADD",
4041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "DP3",
4141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "DP4",
4241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "FRC",
4341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "RCP",
4441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "RSQ",
4541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "EXP",
4641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "LOG",
4741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "CMP",
4841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "MIN",
4941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "MAX",
5041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "FLR",
5141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "MOD",
5241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "TRC",
5341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "SGE",
5441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "SLT",
5541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "TEXLD",
5641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "TEXLDP",
5741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "TEXLDB",
5841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "TEXKILL",
5941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "DCL",
6041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "0x1a",
6141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "0x1b",
6241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "0x1c",
6341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "0x1d",
6441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "0x1e",
6541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "0x1f",
6641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell};
6741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
6841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
6941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic const int args[0x20] = {
7041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   0,				/* 0 nop */
7141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   2,				/* 1 add */
7241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,				/* 2 mov */
7341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   2,				/* 3 m ul */
7441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   3, 				/* 4 mad */
7541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   3,				/* 5 dp2add */
7641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   2,				/* 6 dp3 */
7741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   2,				/* 7 dp4 */
7841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,				/* 8 frc */
7941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,				/* 9 rcp */
8041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,				/* a rsq */
8141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,				/* b exp */
8241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,				/* c log */
8341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   3,				/* d cmp */
8441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   2,				/* e min */
8541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   2,				/* f max */
8641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,				/* 10 flr */
8741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,				/* 11 mod */
8841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,				/* 12 trc */
8941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   2,				/* 13 sge */
9041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   2,				/* 14 slt */
9141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,
9241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,
9341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,
9441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   1,
9541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   0,
9641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   0,
9741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   0,
9841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   0,
9941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   0,
10041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   0,
10141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   0,
10241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell};
10341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
10441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
10541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic const char *regname[0x8] = {
10641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "R",
10741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "T",
10841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "CONST",
10941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "S",
11041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "OC",
11141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "OD",
11241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "U",
11341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   "UNKNOWN",
11441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell};
11541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
11641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic void print_reg_type_nr( GLuint type, GLuint nr )
11741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell{
11841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   switch (type) {
11941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   case REG_TYPE_T:
12041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      switch (nr) {
12141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      case T_DIFFUSE: fprintf(stderr, "T_DIFFUSE"); return;
12241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      case T_SPECULAR: fprintf(stderr, "T_SPECULAR"); return;
12341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      case T_FOG_W: fprintf(stderr, "T_FOG_W"); return;
12441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      default: fprintf(stderr, "T_TEX%d", nr); return;
12541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      }
12641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   case REG_TYPE_OC:
12741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      if (nr == 0) {
12841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 fprintf(stderr, "oC");
12941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 return;
13041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      }
13141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      break;
13241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   case REG_TYPE_OD:
13341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      if (nr == 0) {
13441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 fprintf(stderr, "oD");
13541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 return;
13641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      }
13741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      break;
13841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   default:
13941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      break;
14041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   }
14141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
14241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "%s[%d]", regname[type], nr);
14341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell}
14441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
14541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell#define REG_SWIZZLE_MASK 0x7777
14641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell#define REG_NEGATE_MASK 0x8888
14741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
14841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell#define REG_SWIZZLE_XYZW ((SRC_X << A2_SRC2_CHANNEL_X_SHIFT) |	\
14941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell		      (SRC_Y << A2_SRC2_CHANNEL_Y_SHIFT) |	\
15041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell		      (SRC_Z << A2_SRC2_CHANNEL_Z_SHIFT) |	\
15141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell		      (SRC_W << A2_SRC2_CHANNEL_W_SHIFT))
15241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
15341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
15441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic void print_reg_neg_swizzle( GLuint reg )
15541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell{
15641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   int i;
15741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
15841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if ((reg & REG_SWIZZLE_MASK) == REG_SWIZZLE_XYZW &&
15941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell       (reg & REG_NEGATE_MASK) == 0)
16041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      return;
16141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
16241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, ".");
16341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
16441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   for (i = 3 ; i >= 0; i--) {
16541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      if (reg & (1<<((i*4)+3)))
16641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 fprintf(stderr, "-");
16741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
16841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      switch ((reg>>(i*4)) & 0x7) {
16941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      case 0: fprintf(stderr, "x"); break;
17041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      case 1: fprintf(stderr, "y"); break;
17141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      case 2: fprintf(stderr, "z"); break;
17241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      case 3: fprintf(stderr, "w"); break;
17341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      case 4: fprintf(stderr, "0"); break;
17441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      case 5: fprintf(stderr, "1"); break;
17541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      default: fprintf(stderr, "?"); break;
17641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      }
17741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   }
17841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell}
17941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
18041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
18141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic void print_src_reg( GLuint dword )
18241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell{
18341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   GLuint nr = (dword >> A2_SRC2_NR_SHIFT) & REG_NR_MASK;
18441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   GLuint type = (dword >> A2_SRC2_TYPE_SHIFT) & REG_TYPE_MASK;
18541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_reg_type_nr( type, nr );
18641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_reg_neg_swizzle( dword );
18741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell}
18841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
18941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellvoid i915_print_ureg( const char *msg, GLuint ureg )
19041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell{
19141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "%s: ", msg);
19241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_src_reg( ureg >> 8 );
19341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "\n");
19441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell}
19541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
19641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic void print_dest_reg( GLuint dword )
19741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell{
19841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   GLuint nr = (dword >> A0_DEST_NR_SHIFT) & REG_NR_MASK;
19941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   GLuint type = (dword >> A0_DEST_TYPE_SHIFT) & REG_TYPE_MASK;
20041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_reg_type_nr( type, nr );
20141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if ((dword & A0_DEST_CHANNEL_ALL) == A0_DEST_CHANNEL_ALL)
20241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      return;
20341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, ".");
20441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if (dword & A0_DEST_CHANNEL_X) fprintf(stderr, "x");
20541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if (dword & A0_DEST_CHANNEL_Y) fprintf(stderr, "y");
20641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if (dword & A0_DEST_CHANNEL_Z) fprintf(stderr, "z");
20741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if (dword & A0_DEST_CHANNEL_W) fprintf(stderr, "w");
20841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell}
20941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
21041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
21141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell#define GET_SRC0_REG(r0, r1) ((r0<<14)|(r1>>A1_SRC0_CHANNEL_W_SHIFT))
21241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell#define GET_SRC1_REG(r0, r1) ((r0<<8)|(r1>>A2_SRC1_CHANNEL_W_SHIFT))
21341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell#define GET_SRC2_REG(r)      (r)
21441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
21541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
21641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic void print_arith_op( GLuint opcode, const GLuint *program )
21741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell{
21841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if (opcode != A0_NOP) {
21941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      print_dest_reg(program[0]);
22041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      if (program[0] & A0_DEST_SATURATE)
22141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 fprintf(stderr, " = SATURATE ");
22241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      else
22341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 fprintf(stderr, " = ");
22441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   }
22541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
22641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "%s ", opcodes[opcode]);
22741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
22841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_src_reg(GET_SRC0_REG(program[0], program[1]));
22941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if (args[opcode] == 1) {
23041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      fprintf(stderr, "\n");
23141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      return;
23241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   }
23341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
23441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, ", ");
23541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_src_reg(GET_SRC1_REG(program[1], program[2]));
23641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if (args[opcode] == 2) {
23741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      fprintf(stderr, "\n");
23841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      return;
23941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   }
24041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
24141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, ", ");
24241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_src_reg(GET_SRC2_REG(program[2]));
24341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "\n");
24441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   return;
24541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell}
24641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
24741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
24841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic void print_tex_op( GLuint opcode, const GLuint *program )
24941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell{
25041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_dest_reg(program[0] | A0_DEST_CHANNEL_ALL);
25141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, " = ");
25241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
25341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "%s ", opcodes[opcode]);
25441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
25541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "S[%d],",
25641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	   program[0] & T0_SAMPLER_NR_MASK);
25741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
25841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_reg_type_nr( (program[1]>>T1_ADDRESS_REG_TYPE_SHIFT) & REG_TYPE_MASK,
25941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell		      (program[1]>>T1_ADDRESS_REG_NR_SHIFT) & REG_NR_MASK );
26041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "\n");
26141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell}
26241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
26341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellstatic void print_dcl_op( GLuint opcode, const GLuint *program )
26441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell{
26541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "%s ", opcodes[opcode]);
26641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   print_dest_reg(program[0] | A0_DEST_CHANNEL_ALL);
26741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "\n");
26841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell}
26941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
27041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
27141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwellvoid i915_disassemble_program( const GLuint *program, GLuint sz )
27241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell{
27341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   GLuint size = program[0] & 0x1ff;
27441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   GLint i;
27541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
27641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "BEGIN\n");
27741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
27841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   if (size+2 != sz) {
27941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      fprintf(stderr, "%s: program size mismatch %d/%d\n", __FUNCTION__,
28041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	      size+2, sz);
28141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      exit(1);
28241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   }
28341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
28441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   program ++;
28541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   for (i = 1 ; i < sz ; i+=3, program+=3) {
28641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      GLuint opcode = program[0] & (0x1f<<24);
28741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
288782a32b847d097c33a8fc44d3443be08f967e616Brian Paul      if ((GLint) opcode >= A0_NOP && opcode <= A0_SLT)
28941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 print_arith_op(opcode >> 24, program);
29041b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      else if (opcode >= T0_TEXLD && opcode <= T0_TEXKILL)
29141b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 print_tex_op(opcode >> 24, program);
29241b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      else if (opcode == D0_DCL)
29341b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 print_dcl_op(opcode >> 24, program);
29441b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell      else
29541b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell	 fprintf(stderr, "Unknown opcode 0x%x\n", opcode);
29641b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   }
29741b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell
29841b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell   fprintf(stderr, "END\n\n");
29941b58954e1742493452b91d9ecdb761db5de3bedKeith Whitwell}
300