11c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/* 21c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Copyright (C) 2005 Ben Skeggs. 31c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 41c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * All Rights Reserved. 51c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 61c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining 71c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * a copy of this software and associated documentation files (the 81c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * "Software"), to deal in the Software without restriction, including 91c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * without limitation the rights to use, copy, modify, merge, publish, 101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * distribute, sublicense, and/or sell copies of the Software, and to 111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * permit persons to whom the Software is furnished to do so, subject to 121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * the following conditions: 131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * The above copyright notice and this permission notice (including the 151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * next paragraph) shall be included in all copies or substantial 161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * portions of the Software. 171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "r300_fragprog.h" 291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include <stdio.h> 311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "../r300_reg.h" 331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void presub_string(char out[10], unsigned int inst) 351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(inst & 0x600000){ 371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_SRCP_1_MINUS_2_SRC0: 381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(out, "bias"); 391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_SRCP_SRC1_MINUS_SRC0: 411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(out, "sub"); 421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_SRCP_SRC1_PLUS_SRC0: 441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(out, "add"); 451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_SRCP_1_MINUS_SRC0: 471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(out, "inv "); 481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic int get_msb(unsigned int bit, unsigned int r400_ext_addr) 531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return (r400_ext_addr & bit) ? 1 << 5 : 0; 551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/* just some random things... */ 581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid r300FragmentProgramDump(struct radeon_compiler *c, void *user) 591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct r300_fragment_program_compiler *compiler = (struct r300_fragment_program_compiler*)c; 611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct r300_fragment_program_code *code = &compiler->code->code.r300; 621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int n, i, j; 631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák static int pc = 0; 641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "pc=%d*************************************\n", pc++); 661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "Hardware program\n"); 681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "----------------\n"); 691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (c->is_r400) { 701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "code_offset_ext: %08x\n", code->r400_code_offset_ext); 711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for (n = 0; n <= (code->config & 3); n++) { 741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák uint32_t code_addr = code->code_addr[3 - (code->config & 3) + n]; 751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int alu_offset = ((code_addr & R300_ALU_START_MASK) >> R300_ALU_START_SHIFT) + 761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (((code->r400_code_offset_ext >> (24 - (n * 6))) & 0x7) << 6); 771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int alu_end = ((code_addr & R300_ALU_SIZE_MASK) >> R300_ALU_SIZE_SHIFT) + 781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (((code->r400_code_offset_ext >> (27 - (n * 6))) & 0x7) << 6); 791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int tex_offset = (code_addr & R300_TEX_START_MASK) >> R300_TEX_START_SHIFT; 801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int tex_end = (code_addr & R300_TEX_SIZE_MASK) >> R300_TEX_SIZE_SHIFT; 811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "NODE %d: alu_offset: %u, tex_offset: %d, " 831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák "alu_end: %u, tex_end: %d (code_addr: %08x)\n", n, 841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák alu_offset, tex_offset, alu_end, tex_end, code_addr); 851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (n > 0 || (code->config & R300_PFS_CNTL_FIRST_NODE_HAS_TEX)) { 871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, " TEX:\n"); 881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for (i = tex_offset; 891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák i <= tex_offset + tex_end; 901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák ++i) { 911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák const char *instr; 921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch ((code->tex. 941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst[i] >> R300_TEX_INST_SHIFT) & 951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 15) { 961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_TEX_OP_LD: 971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák instr = "TEX"; 981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_TEX_OP_KIL: 1001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák instr = "KIL"; 1011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 1021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_TEX_OP_TXP: 1031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák instr = "TXP"; 1041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 1051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_TEX_OP_TXB: 1061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák instr = "TXB"; 1071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 1081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák default: 1091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák instr = "UNKNOWN"; 1101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, 1131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák " %s t%i, %c%i, texture[%i] (%08x)\n", 1141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák instr, 1151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->tex. 1161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst[i] >> R300_DST_ADDR_SHIFT) & 31, 1171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 't', 1181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->tex. 1191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst[i] >> R300_SRC_ADDR_SHIFT) & 31, 1201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->tex. 1211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst[i] & R300_TEX_ID_MASK) >> 1221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák R300_TEX_ID_SHIFT, 1231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->tex.inst[i]); 1241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for (i = alu_offset; 1281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák i <= alu_offset + alu_end; ++i) { 1291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char srcc[4][10], dstc[20]; 1301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char srca[4][10], dsta[20]; 1311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char argc[3][20]; 1321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char arga[3][20]; 1331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char flags[5], tmp[10]; 1341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for (j = 0; j < 3; ++j) { 1361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int regc = code->alu.inst[i].rgb_addr >> (j * 6); 1371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int rega = code->alu.inst[i].alpha_addr >> (j * 6); 1381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int msbc = get_msb(R400_ADDR_EXT_RGB_MSB_BIT(j), 1391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->alu.inst[i].r400_ext_addr); 1401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int msba = get_msb(R400_ADDR_EXT_A_MSB_BIT(j), 1411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->alu.inst[i].r400_ext_addr); 1421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(srcc[j], "%c%i", 1441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (regc & 32) ? 'c' : 't', (regc & 31) | msbc); 1451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(srca[j], "%c%i", 1461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (rega & 32) ? 'c' : 't', (rega & 31) | msba); 1471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák dstc[0] = 0; 1501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(flags, "%s%s%s", 1511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->alu.inst[i]. 1521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rgb_addr & R300_ALU_DSTC_REG_X) ? "x" : "", 1531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->alu.inst[i]. 1541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rgb_addr & R300_ALU_DSTC_REG_Y) ? "y" : "", 1551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->alu.inst[i]. 1561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rgb_addr & R300_ALU_DSTC_REG_Z) ? "z" : ""); 1571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (flags[0] != 0) { 1581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int msb = get_msb( 1591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák R400_ADDRD_EXT_RGB_MSB_BIT, 1601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->alu.inst[i].r400_ext_addr); 1611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(dstc, "t%i.%s ", 1631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák ((code->alu.inst[i]. 1641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rgb_addr >> R300_ALU_DSTC_SHIFT) 1651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák & 31) | msb, 1661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák flags); 1671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(flags, "%s%s%s", 1691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->alu.inst[i]. 1701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rgb_addr & R300_ALU_DSTC_OUTPUT_X) ? "x" : "", 1711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->alu.inst[i]. 1721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rgb_addr & R300_ALU_DSTC_OUTPUT_Y) ? "y" : "", 1731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->alu.inst[i]. 1741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rgb_addr & R300_ALU_DSTC_OUTPUT_Z) ? "z" : ""); 1751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (flags[0] != 0) { 1761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(tmp, "o%i.%s", 1771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->alu.inst[i]. 1781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rgb_addr >> 29) & 3, 1791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák flags); 1801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák strcat(dstc, tmp); 1811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* Presub */ 1831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák presub_string(srcc[3], code->alu.inst[i].rgb_inst); 1841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák presub_string(srca[3], code->alu.inst[i].alpha_inst); 1851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák dsta[0] = 0; 1871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (code->alu.inst[i].alpha_addr & R300_ALU_DSTA_REG) { 1881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int msb = get_msb( 1891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák R400_ADDRD_EXT_A_MSB_BIT, 1901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->alu.inst[i].r400_ext_addr); 1911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(dsta, "t%i.w ", 1921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák ((code->alu.inst[i]. 1931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák alpha_addr >> R300_ALU_DSTA_SHIFT) & 31) 1941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák | msb); 1951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (code->alu.inst[i].alpha_addr & R300_ALU_DSTA_OUTPUT) { 1971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(tmp, "o%i.w ", 1981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (code->alu.inst[i]. 1991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák alpha_addr >> 25) & 3); 2001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák strcat(dsta, tmp); 2011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (code->alu.inst[i].alpha_addr & R300_ALU_DSTA_DEPTH) { 2031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák strcat(dsta, "Z"); 2041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, 2071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák "%3i: xyz: %3s %3s %3s %5s-> %-20s (%08x)\n" 2081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák " w: %3s %3s %3s %5s-> %-20s (%08x)\n", i, 2091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák srcc[0], srcc[1], srcc[2], srcc[3], dstc, 2101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->alu.inst[i].rgb_addr, srca[0], srca[1], 2111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák srca[2], srca[3], dsta, 2121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->alu.inst[i].alpha_addr); 2131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for (j = 0; j < 3; ++j) { 2151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int regc = code->alu.inst[i].rgb_inst >> (j * 7); 2161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int rega = code->alu.inst[i].alpha_inst >> (j * 7); 2171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int d; 2181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char buf[20]; 2191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák d = regc & 31; 2211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (d < 12) { 2221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch (d % 4) { 2231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGC_SRC0C_XYZ: 2241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.xyz", 2251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák srcc[d / 4]); 2261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGC_SRC0C_XXX: 2281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.xxx", 2291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák srcc[d / 4]); 2301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGC_SRC0C_YYY: 2321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.yyy", 2331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák srcc[d / 4]); 2341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGC_SRC0C_ZZZ: 2361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.zzz", 2371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák srcc[d / 4]); 2381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d < 15) { 2411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.www", srca[d - 12]); 2421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d < 20 ) { 2431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(d) { 2441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGC_SRCP_XYZ: 2451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "srcp.xyz"); 2461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGC_SRCP_XXX: 2481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "srcp.xxx"); 2491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGC_SRCP_YYY: 2511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "srcp.yyy"); 2521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGC_SRCP_ZZZ: 2541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "srcp.zzz"); 2551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGC_SRCP_WWW: 2571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "srcp.www"); 2581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d == 20) { 2611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "0.0"); 2621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d == 21) { 2631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "1.0"); 2641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d == 22) { 2651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "0.5"); 2661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d >= 23 && d < 32) { 2671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák d -= 23; 2681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch (d / 3) { 2691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 0: 2701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.yzx", 2711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák srcc[d % 3]); 2721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 1: 2741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.zxy", 2751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák srcc[d % 3]); 2761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 2: 2781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.Wzy", 2791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák srcc[d % 3]); 2801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 2811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else { 2831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%i", d); 2841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(argc[j], "%s%s%s%s", 2871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (regc & 32) ? "-" : "", 2881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (regc & 64) ? "|" : "", 2891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák buf, (regc & 64) ? "|" : ""); 2901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák d = rega & 31; 2921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (d < 9) { 2931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.%c", srcc[d / 3], 2941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 'x' + (char)(d % 3)); 2951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d < 12) { 2961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%s.w", srca[d - 9]); 2971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d < 16) { 2981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(d) { 2991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGA_SRCP_X: 3001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "srcp.x"); 3011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 3021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGA_SRCP_Y: 3031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "srcp.y"); 3041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 3051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGA_SRCP_Z: 3061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "srcp.z"); 3071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 3081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R300_ALU_ARGA_SRCP_W: 3091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "srcp.w"); 3101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 3111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 3121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d == 16) { 3131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "0.0"); 3141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d == 17) { 3151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "1.0"); 3161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (d == 18) { 3171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "0.5"); 3181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else { 3191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(buf, "%i", d); 3201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 3211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 3221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák sprintf(arga[j], "%s%s%s%s", 3231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (rega & 32) ? "-" : "", 3241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (rega & 64) ? "|" : "", 3251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák buf, (rega & 64) ? "|" : ""); 3261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 3271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 3281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, " xyz: %8s %8s %8s op: %08x %s\n" 3291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák " w: %8s %8s %8s op: %08x\n", 3301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák argc[0], argc[1], argc[2], 3311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->alu.inst[i].rgb_inst, 3321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->alu.inst[i].rgb_inst & R300_ALU_INSERT_NOP ? 3331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák "NOP" : "", 3341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák arga[0], arga[1],arga[2], 3351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák code->alu.inst[i].alpha_inst); 3361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 3371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 3381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 339