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