11c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/*
21c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
31c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák *
41c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining a
51c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * copy of this software and associated documentation files (the "Software"),
61c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * to deal in the Software without restriction, including without limitation
71c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * on the rights to use, copy, modify, merge, publish, distribute, sub
81c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * license, and/or sell copies of the Software, and to permit persons to whom
91c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * the Software is furnished to do so, subject to the following conditions:
101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák *
111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * The above copyright notice and this permission notice (including the next
121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * paragraph) shall be included in all copies or substantial portions of the
131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Software.
141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák *
151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * USE OR OTHER DEALINGS IN THE SOFTWARE. */
221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_program.h"
241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include <stdio.h>
261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic const char * textarget_to_string(rc_texture_target target)
281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	switch(target) {
301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_TEXTURE_2D_ARRAY: return "2D_ARRAY";
311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_TEXTURE_1D_ARRAY: return "1D_ARRAY";
321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_TEXTURE_CUBE: return "CUBE";
331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_TEXTURE_3D: return "3D";
341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_TEXTURE_RECT: return "RECT";
351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_TEXTURE_2D: return "2D";
361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_TEXTURE_1D: return "1D";
371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	default: return "BAD_TEXTURE_TARGET";
381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic const char * presubtract_op_to_string(rc_presubtract_op op)
421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	switch(op) {
441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_PRESUB_NONE:
451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return "NONE";
461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_PRESUB_BIAS:
471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return "(1 - 2 * src0)";
481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_PRESUB_SUB:
491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return "(src1 - src0)";
501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_PRESUB_ADD:
511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return "(src1 + src0)";
521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_PRESUB_INV:
531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return "(1 - src0)";
541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	default:
551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return "BAD_PRESUBTRACT_OP";
561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
59e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellardstatic void print_omod_op(FILE * f, rc_omod_op op)
60e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard{
61e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	const char * omod_str;
62e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard
63e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	switch(op) {
64e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	case RC_OMOD_MUL_1:
65e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	case RC_OMOD_DISABLE:
66e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		return;
67e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	case RC_OMOD_MUL_2:
68e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		omod_str = "* 2";
69e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		break;
70e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	case RC_OMOD_MUL_4:
71e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		omod_str = "* 4";
72e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		break;
73e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	case RC_OMOD_MUL_8:
74e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		omod_str = "* 8";
75e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		break;
76e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	case RC_OMOD_DIV_2:
77e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		omod_str = "/ 2";
78e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		break;
79e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	case RC_OMOD_DIV_4:
80e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		omod_str = "/ 4";
81e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		break;
82e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	case RC_OMOD_DIV_8:
83e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		omod_str = "/ 8";
84e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		break;
85e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	default:
86e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		return;
87e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	}
88e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard	fprintf(f, " %s", omod_str);
89e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard}
90e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard
911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void rc_print_comparefunc(FILE * f, const char * lhs, rc_compare_func func, const char * rhs)
921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (func == RC_COMPARE_FUNC_NEVER) {
941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "false");
951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	} else if (func == RC_COMPARE_FUNC_ALWAYS) {
961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "true");
971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	} else {
981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		const char * op;
991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		switch(func) {
1001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_COMPARE_FUNC_LESS: op = "<"; break;
1011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_COMPARE_FUNC_EQUAL: op = "=="; break;
1021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_COMPARE_FUNC_LEQUAL: op = "<="; break;
1031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_COMPARE_FUNC_GREATER: op = ">"; break;
1041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_COMPARE_FUNC_NOTEQUAL: op = "!="; break;
1051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_COMPARE_FUNC_GEQUAL: op = ">="; break;
1061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		default: op = "???"; break;
1071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		}
1081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "%s %s %s", lhs, op, rhs);
1091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
1101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
1111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
112befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellardstatic void rc_print_inline_float(FILE * f, int index)
113befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard{
114befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	int r300_exponent = (index >> 3) & 0xf;
115befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	unsigned r300_mantissa = index & 0x7;
116befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	unsigned float_exponent;
117befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	unsigned real_float;
118befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	float * print_float = (float*) &real_float;
119befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard
120befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	r300_exponent -= 7;
121befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	float_exponent = r300_exponent + 127;
122befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	real_float = (r300_mantissa << 20) | (float_exponent << 23);
123befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard
124befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	fprintf(f, "%f (0x%x)", *print_float, index);
125befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard
126befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard}
127befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard
1281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void rc_print_register(FILE * f, rc_register_file file, int index, unsigned int reladdr)
1291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
1301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (file == RC_FILE_NONE) {
1311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "none");
1321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	} else if (file == RC_FILE_SPECIAL) {
1331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		switch(index) {
1341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_SPECIAL_ALU_RESULT: fprintf(f, "aluresult"); break;
1351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		default: fprintf(f, "special[%i]", index); break;
1361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		}
137befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard	} else if (file == RC_FILE_INLINE) {
138befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard		rc_print_inline_float(f, index);
1391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	} else {
1401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		const char * filename;
1411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		switch(file) {
1421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_FILE_TEMPORARY: filename = "temp"; break;
1431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_FILE_INPUT: filename = "input"; break;
1441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_FILE_OUTPUT: filename = "output"; break;
1451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_FILE_ADDRESS: filename = "addr"; break;
1461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		case RC_FILE_CONSTANT: filename = "const"; break;
1471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		default: filename = "BAD FILE"; break;
1481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		}
1491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "%s[%i%s]", filename, index, reladdr ? " + addr[0]" : "");
1501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
1511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
1521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
1531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void rc_print_mask(FILE * f, unsigned int mask)
1541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
1551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (mask & RC_MASK_X) fprintf(f, "x");
1561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (mask & RC_MASK_Y) fprintf(f, "y");
1571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (mask & RC_MASK_Z) fprintf(f, "z");
1581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (mask & RC_MASK_W) fprintf(f, "w");
1591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
1601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
1611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void rc_print_dst_register(FILE * f, struct rc_dst_register dst)
1621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
1631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	rc_print_register(f, dst.File, dst.Index, 0);
1641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (dst.WriteMask != RC_MASK_XYZW) {
1651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, ".");
1661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_mask(f, dst.WriteMask);
1671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
1681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
1691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
1701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic char rc_swizzle_char(unsigned int swz)
1711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
1721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	switch(swz) {
1731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SWIZZLE_X: return 'x';
1741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SWIZZLE_Y: return 'y';
1751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SWIZZLE_Z: return 'z';
1761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SWIZZLE_W: return 'w';
1771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SWIZZLE_ZERO: return '0';
1781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SWIZZLE_ONE: return '1';
1791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SWIZZLE_HALF: return 'H';
1801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SWIZZLE_UNUSED: return '_';
1811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
1821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	fprintf(stderr, "bad swz: %u\n", swz);
1831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	return '?';
1841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
1851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
1861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void rc_print_swizzle(FILE * f, unsigned int swizzle, unsigned int negate)
1871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
1881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	unsigned int comp;
1891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	for(comp = 0; comp < 4; ++comp) {
1901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_swizzle swz = GET_SWZ(swizzle, comp);
1911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (GET_BIT(negate, comp))
1921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, "-");
1931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "%c", rc_swizzle_char(swz));
1941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
1951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
1961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
1971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void rc_print_presub_instruction(FILE * f,
1981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák					struct rc_presub_instruction inst)
1991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
2001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	fprintf(f,"(");
2011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	switch(inst.Opcode){
2021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_PRESUB_BIAS:
2031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "1 - 2 * ");
2041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_register(f, inst.SrcReg[0].File,
2051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				inst.SrcReg[0].Index,inst.SrcReg[0].RelAddr);
2061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		break;
2071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_PRESUB_SUB:
2081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_register(f, inst.SrcReg[1].File,
2091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				inst.SrcReg[1].Index,inst.SrcReg[1].RelAddr);
2101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, " - ");
2111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_register(f, inst.SrcReg[0].File,
2121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				inst.SrcReg[0].Index,inst.SrcReg[0].RelAddr);
2131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		break;
2141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_PRESUB_ADD:
2151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_register(f, inst.SrcReg[1].File,
2161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				inst.SrcReg[1].Index,inst.SrcReg[1].RelAddr);
2171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, " + ");
2181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_register(f, inst.SrcReg[0].File,
2191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				inst.SrcReg[0].Index,inst.SrcReg[0].RelAddr);
2201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		break;
2211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_PRESUB_INV:
2221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "1 - ");
2231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_register(f, inst.SrcReg[0].File,
2241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				inst.SrcReg[0].Index,inst.SrcReg[0].RelAddr);
2251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		break;
2261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	default:
2271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		break;
2281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
2291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	fprintf(f, ")");
2301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
2311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void rc_print_src_register(FILE * f, struct rc_instruction * inst,
2331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák						struct rc_src_register src)
2341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
2351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	int trivial_negate = (src.Negate == RC_MASK_NONE || src.Negate == RC_MASK_XYZW);
2361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (src.Negate == RC_MASK_XYZW)
2381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "-");
2391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (src.Abs)
2401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "|");
2411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if(src.File == RC_FILE_PRESUB)
2431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_presub_instruction(f, inst->U.I.PreSub);
2441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	else
2451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_register(f, src.File, src.Index, src.RelAddr);
2461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (src.Abs && !trivial_negate)
2481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "|");
2491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (src.Swizzle != RC_SWIZZLE_XYZW || !trivial_negate) {
2511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, ".");
2521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_swizzle(f, src.Swizzle, trivial_negate ? 0 : src.Negate);
2531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
2541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (src.Abs && trivial_negate)
2561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "|");
2571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
2581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic unsigned update_branch_depth(rc_opcode opcode, unsigned *branch_depth)
2601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
2611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	switch (opcode) {
2621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_OPCODE_IF:
2631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_OPCODE_BGNLOOP:
2641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return (*branch_depth)++ * 2;
2651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_OPCODE_ENDIF:
2671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_OPCODE_ENDLOOP:
2681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		assert(*branch_depth > 0);
2691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return --(*branch_depth) * 2;
2701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_OPCODE_ELSE:
2721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		assert(*branch_depth > 0);
2731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return (*branch_depth - 1) * 2;
2741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	default:
2761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		return *branch_depth * 2;
2771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
2781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
2791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void rc_print_normal_instruction(FILE * f, struct rc_instruction * inst, unsigned *branch_depth)
2811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
2821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->U.I.Opcode);
2831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	unsigned int reg;
2841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	unsigned spaces = update_branch_depth(inst->U.I.Opcode, branch_depth);
2851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	for (unsigned i = 0; i < spaces; i++)
2871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, " ");
2881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	fprintf(f, "%s", opcode->Name);
2901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	switch(inst->U.I.SaturateMode) {
2921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SATURATE_NONE: break;
2931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SATURATE_ZERO_ONE: fprintf(f, "_SAT"); break;
2941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	case RC_SATURATE_MINUS_PLUS_ONE: fprintf(f, "_SAT2"); break;
2951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	default: fprintf(f, "_BAD_SAT"); break;
2961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
2971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
2981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (opcode->HasDstReg) {
2991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, " ");
3001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_dst_register(f, inst->U.I.DstReg);
301e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		print_omod_op(f, inst->U.I.Omod);
3021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (opcode->NumSrcRegs)
3031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, ",");
3041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
3051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	for(reg = 0; reg < opcode->NumSrcRegs; ++reg) {
3071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (reg > 0)
3081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, ",");
3091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, " ");
3101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_src_register(f, inst, inst->U.I.SrcReg[reg]);
3111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
3121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (opcode->HasTexture) {
314163629fd05166b78d70c2c26f4a922b296e8999dTom Stellard		fprintf(f, ", %s%s[%u]%s%s",
3151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			textarget_to_string(inst->U.I.TexSrcTarget),
3161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			inst->U.I.TexShadow ? "SHADOW" : "",
317163629fd05166b78d70c2c26f4a922b296e8999dTom Stellard			inst->U.I.TexSrcUnit,
318163629fd05166b78d70c2c26f4a922b296e8999dTom Stellard			inst->U.I.TexSemWait ? " SEM_WAIT" : "",
319163629fd05166b78d70c2c26f4a922b296e8999dTom Stellard			inst->U.I.TexSemAcquire ? " SEM_ACQUIRE" : "");
3201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
3211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	fprintf(f, ";");
3231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (inst->U.I.WriteALUResult) {
3251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, " [aluresult = (");
3261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_comparefunc(f,
3271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			(inst->U.I.WriteALUResult == RC_ALURESULT_X) ? "x" : "w",
3281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			inst->U.I.ALUResultCompare, "0");
3291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, ")]");
3301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
3311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
332b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard	if (inst->U.I.DstReg.Pred == RC_PRED_SET) {
333b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard		fprintf(f, " PRED_SET");
334b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard	} else if (inst->U.I.DstReg.Pred == RC_PRED_INV) {
335b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard		fprintf(f, " PRED_INV");
336b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard	}
337b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard
3381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	fprintf(f, "\n");
3391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
3401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void rc_print_pair_instruction(FILE * f, struct rc_instruction * fullinst, unsigned *branch_depth)
3421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
3431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	struct rc_pair_instruction * inst = &fullinst->U.P;
3441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	int printedsrc = 0;
3451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	unsigned spaces = update_branch_depth(inst->RGB.Opcode != RC_OPCODE_NOP ?
3461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák					      inst->RGB.Opcode : inst->Alpha.Opcode, branch_depth);
3471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	for (unsigned i = 0; i < spaces; i++)
3491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, " ");
3501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	for(unsigned int src = 0; src < 3; ++src) {
3521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->RGB.Src[src].Used) {
3531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			if (printedsrc)
3541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				fprintf(f, ", ");
3551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, "src%i.xyz = ", src);
3561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			rc_print_register(f, inst->RGB.Src[src].File, inst->RGB.Src[src].Index, 0);
3571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			printedsrc = 1;
3581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		}
3591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->Alpha.Src[src].Used) {
3601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			if (printedsrc)
3611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				fprintf(f, ", ");
3621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, "src%i.w = ", src);
3631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			rc_print_register(f, inst->Alpha.Src[src].File, inst->Alpha.Src[src].Index, 0);
3641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			printedsrc = 1;
3651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		}
3661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
3671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if(inst->RGB.Src[RC_PAIR_PRESUB_SRC].Used) {
3681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, ", srcp.xyz = %s",
3691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			presubtract_op_to_string(
3701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák					inst->RGB.Src[RC_PAIR_PRESUB_SRC].Index));
3711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
3721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if(inst->Alpha.Src[RC_PAIR_PRESUB_SRC].Used) {
3731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, ", srcp.w = %s",
3741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			presubtract_op_to_string(
3751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák					inst->Alpha.Src[RC_PAIR_PRESUB_SRC].Index));
3761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
377163629fd05166b78d70c2c26f4a922b296e8999dTom Stellard	if (inst->SemWait) {
378163629fd05166b78d70c2c26f4a922b296e8999dTom Stellard		fprintf(f, " SEM_WAIT");
379163629fd05166b78d70c2c26f4a922b296e8999dTom Stellard	}
3801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	fprintf(f, "\n");
3811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (inst->RGB.Opcode != RC_OPCODE_NOP) {
3831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->RGB.Opcode);
3841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		for (unsigned i = 0; i < spaces; i++)
3861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " ");
3871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
3881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "     %s%s", opcode->Name, inst->RGB.Saturate ? "_SAT" : "");
3891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->RGB.WriteMask)
3901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " temp[%i].%s%s%s", inst->RGB.DestIndex,
3911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				(inst->RGB.WriteMask & 1) ? "x" : "",
3921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				(inst->RGB.WriteMask & 2) ? "y" : "",
3931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				(inst->RGB.WriteMask & 4) ? "z" : "");
3941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->RGB.OutputWriteMask)
3951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " color[%i].%s%s%s", inst->RGB.Target,
3961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				(inst->RGB.OutputWriteMask & 1) ? "x" : "",
3971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				(inst->RGB.OutputWriteMask & 2) ? "y" : "",
3981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				(inst->RGB.OutputWriteMask & 4) ? "z" : "");
3991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->WriteALUResult == RC_ALURESULT_X)
4001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " aluresult");
4011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
402e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		print_omod_op(f, inst->RGB.Omod);
403e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard
4041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		for(unsigned int arg = 0; arg < opcode->NumSrcRegs; ++arg) {
4051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			const char* abs = inst->RGB.Arg[arg].Abs ? "|" : "";
4061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			const char* neg = inst->RGB.Arg[arg].Negate ? "-" : "";
4071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, ", %s%ssrc", neg, abs);
4081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			if(inst->RGB.Arg[arg].Source == RC_PAIR_PRESUB_SRC)
4091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				fprintf(f,"p");
4101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			else
4111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				fprintf(f,"%d", inst->RGB.Arg[arg].Source);
4121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f,".%c%c%c%s",
4131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				rc_swizzle_char(GET_SWZ(inst->RGB.Arg[arg].Swizzle, 0)),
4141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				rc_swizzle_char(GET_SWZ(inst->RGB.Arg[arg].Swizzle, 1)),
4151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				rc_swizzle_char(GET_SWZ(inst->RGB.Arg[arg].Swizzle, 2)),
4161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				abs);
4171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		}
4181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "\n");
4191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
4201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (inst->Alpha.Opcode != RC_OPCODE_NOP) {
4221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->Alpha.Opcode);
4231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		for (unsigned i = 0; i < spaces; i++)
4251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " ");
4261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "     %s%s", opcode->Name, inst->Alpha.Saturate ? "_SAT" : "");
4281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->Alpha.WriteMask)
4291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " temp[%i].w", inst->Alpha.DestIndex);
4301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->Alpha.OutputWriteMask)
4311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " color[%i].w", inst->Alpha.Target);
4321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->Alpha.DepthWriteMask)
4331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " depth.w");
4341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->WriteALUResult == RC_ALURESULT_W)
4351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " aluresult");
4361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
437e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard		print_omod_op(f, inst->Alpha.Omod);
438e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard
4391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		for(unsigned int arg = 0; arg < opcode->NumSrcRegs; ++arg) {
4401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			const char* abs = inst->Alpha.Arg[arg].Abs ? "|" : "";
4411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			const char* neg = inst->Alpha.Arg[arg].Negate ? "-" : "";
4421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, ", %s%ssrc", neg, abs);
4431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			if(inst->Alpha.Arg[arg].Source == RC_PAIR_PRESUB_SRC)
4441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				fprintf(f,"p");
4451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			else
4461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				fprintf(f,"%d", inst->Alpha.Arg[arg].Source);
4471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f,".%c%s",
4481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák				rc_swizzle_char(GET_SWZ(inst->Alpha.Arg[arg].Swizzle, 0)), abs);
4491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		}
4501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "\n");
4511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
4521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	if (inst->WriteALUResult) {
4541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		for (unsigned i = 0; i < spaces; i++)
4551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			fprintf(f, " ");
4561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, "      [aluresult = (");
4581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		rc_print_comparefunc(f, "result", inst->ALUResultCompare, "0");
4591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(f, ")]\n");
4601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
4611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
4621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/**
4641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Print program to stderr, default options.
4651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */
4661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_print_program(const struct rc_program *prog)
4671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{
4681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	unsigned int linenum = 0;
4691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	unsigned branch_depth = 0;
4701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	struct rc_instruction *inst;
4711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	fprintf(stderr, "# Radeon Compiler Program\n");
4731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	for(inst = prog->Instructions.Next; inst != &prog->Instructions; inst = inst->Next) {
4751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		fprintf(stderr, "%3d: ", linenum);
4761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		if (inst->Type == RC_INSTRUCTION_PAIR)
4781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			rc_print_pair_instruction(stderr, inst, &branch_depth);
4791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		else
4801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák			rc_print_normal_instruction(stderr, inst, &branch_depth);
4811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák
4821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák		linenum++;
4831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák	}
4841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}
485