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