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