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