11c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/* 21c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 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 "r500_fragprog.h" 291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include <stdio.h> 311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_compiler_util.h" 331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_list.h" 341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_variable.h" 351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "../r300_reg.h" 361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/** 381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Rewrite IF instructions to use the ALU result special register. 391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákint r500_transform_IF( 411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct radeon_compiler * c, 421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_instruction * inst_if, 431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák void *data) 441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_variable * writer; 461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_list * writer_list, * list_ptr; 471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_list * var_list = rc_get_variables(c); 481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int generic_if = 0; 491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int alu_chan; 501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (inst_if->U.I.Opcode != RC_OPCODE_IF) { 521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 0; 531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer_list = rc_variable_list_get_writers( 561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák var_list, inst_if->Type, &inst_if->U.I.SrcReg[0]); 571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (!writer_list) { 581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák generic_if = 1; 591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else { 601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* Make sure it is safe for the writers to write to 621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * ALU Result */ 631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for (list_ptr = writer_list; list_ptr; 641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák list_ptr = list_ptr->Next) { 651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_instruction * inst; 661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer = list_ptr->Item; 671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* We are going to modify the destination register 681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * of writer, so if it has a reader other than 691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * inst_if (aka ReaderCount > 1) we must fall back to 701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * our generic IF. 711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * If the writer has a lower IP than inst_if, this 721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * means that inst_if is above the writer in a loop. 731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * I'm not sure why this would ever happen, but 741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * if it does we want to make sure we fall back 751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * to our generic IF. */ 761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (writer->ReaderCount > 1 || writer->Inst->IP < inst_if->IP) { 771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák generic_if = 1; 781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* The ALU Result is not preserved across IF 821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * instructions, so if there is another IF 831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * instruction between writer and inst_if, then 841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * we need to fall back to generic IF. */ 851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for (inst = writer->Inst; inst != inst_if; inst = inst->Next) { 861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák const struct rc_opcode_info * info = 871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rc_get_opcode_info(inst->U.I.Opcode); 881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (info->IsFlowControl) { 891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák generic_if = 1; 901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (generic_if) { 941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (GET_SWZ(inst_if->U.I.SrcReg[0].Swizzle, 0) == RC_SWIZZLE_X) { 1001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák alu_chan = RC_ALURESULT_X; 1011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else { 1021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák alu_chan = RC_ALURESULT_W; 1031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (generic_if) { 1051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_instruction * inst_mov = 1061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rc_insert_new_instruction(c, inst_if->Prev); 1071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.Opcode = RC_OPCODE_MOV; 1091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.DstReg.WriteMask = 0; 1101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.DstReg.File = RC_FILE_NONE; 1111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.ALUResultCompare = RC_COMPARE_FUNC_NOTEQUAL; 1121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.WriteALUResult = alu_chan; 1131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.SrcReg[0] = inst_if->U.I.SrcReg[0]; 1141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (alu_chan == RC_ALURESULT_X) { 1151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.SrcReg[0].Swizzle = combine_swizzles4( 1161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.SrcReg[0].Swizzle, 1171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_SWIZZLE_X, RC_SWIZZLE_UNUSED, 1181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_SWIZZLE_UNUSED, RC_SWIZZLE_UNUSED); 1191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else { 1201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.SrcReg[0].Swizzle = combine_swizzles4( 1211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_mov->U.I.SrcReg[0].Swizzle, 1221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_SWIZZLE_UNUSED, RC_SWIZZLE_UNUSED, 1231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_SWIZZLE_UNUSED, RC_SWIZZLE_Z); 1241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else { 1261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rc_compare_func compare_func = RC_COMPARE_FUNC_NEVER; 1271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int reverse_srcs = 0; 1281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int preserve_opcode = 0; 1291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for (list_ptr = writer_list; list_ptr; 1301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák list_ptr = list_ptr->Next) { 1311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer = list_ptr->Item; 1321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(writer->Inst->U.I.Opcode) { 1331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case RC_OPCODE_SEQ: 1341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák compare_func = RC_COMPARE_FUNC_EQUAL; 1351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 1361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case RC_OPCODE_SNE: 1371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák compare_func = RC_COMPARE_FUNC_NOTEQUAL; 1381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 1391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case RC_OPCODE_SLE: 1401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák reverse_srcs = 1; 1411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* Fall through */ 1421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case RC_OPCODE_SGE: 1431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák compare_func = RC_COMPARE_FUNC_GEQUAL; 1441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 1451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case RC_OPCODE_SGT: 1461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák reverse_srcs = 1; 1471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* Fall through */ 1481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case RC_OPCODE_SLT: 1491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák compare_func = RC_COMPARE_FUNC_LESS; 1501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 1511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák default: 1521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák compare_func = RC_COMPARE_FUNC_NOTEQUAL; 1531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák preserve_opcode = 1; 1541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 1551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (!preserve_opcode) { 1571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer->Inst->U.I.Opcode = RC_OPCODE_SUB; 1581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer->Inst->U.I.DstReg.WriteMask = 0; 1601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer->Inst->U.I.DstReg.File = RC_FILE_NONE; 1611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer->Inst->U.I.WriteALUResult = alu_chan; 1621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer->Inst->U.I.ALUResultCompare = compare_func; 1631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (reverse_srcs) { 1641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_src_register temp_src; 1651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák temp_src = writer->Inst->U.I.SrcReg[0]; 1661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer->Inst->U.I.SrcReg[0] = 1671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer->Inst->U.I.SrcReg[1]; 1681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák writer->Inst->U.I.SrcReg[1] = temp_src; 1691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 1721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_if->U.I.SrcReg[0].File = RC_FILE_SPECIAL; 1741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_if->U.I.SrcReg[0].Index = RC_SPECIAL_ALU_RESULT; 1751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_if->U.I.SrcReg[0].Swizzle = RC_MAKE_SWIZZLE( 1761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_SWIZZLE_X, RC_SWIZZLE_UNUSED, 1771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_SWIZZLE_UNUSED, RC_SWIZZLE_UNUSED); 1781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst_if->U.I.SrcReg[0].Negate = 0; 1791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 1; 1811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 1821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic int r500_swizzle_is_native(rc_opcode opcode, struct rc_src_register reg) 1841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 1851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int relevant; 1861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int i; 1871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (opcode == RC_OPCODE_TEX || 1891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák opcode == RC_OPCODE_TXB || 1901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák opcode == RC_OPCODE_TXP || 1911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák opcode == RC_OPCODE_TXD || 1921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák opcode == RC_OPCODE_TXL || 1931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák opcode == RC_OPCODE_KIL) { 1941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (reg.Abs) 1951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 0; 1961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (opcode == RC_OPCODE_KIL && (reg.Swizzle != RC_SWIZZLE_XYZW || reg.Negate != RC_MASK_NONE)) 1981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 0; 1991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for(i = 0; i < 4; ++i) { 2011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int swz = GET_SWZ(reg.Swizzle, i); 2021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (swz == RC_SWIZZLE_UNUSED) { 2031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák reg.Negate &= ~(1 << i); 2041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák continue; 2051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (swz >= 4) 2071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 0; 2081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (reg.Negate) 2111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 0; 2121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 1; 2141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else if (opcode == RC_OPCODE_DDX || opcode == RC_OPCODE_DDY) { 2151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* DDX/MDH and DDY/MDV explicitly ignore incoming swizzles; 2161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * if it doesn't fit perfectly into a .xyzw case... */ 2171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (reg.Swizzle == RC_SWIZZLE_XYZW && !reg.Abs && !reg.Negate) 2181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 1; 2191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 0; 221befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard } else if (reg.File == RC_FILE_INLINE) { 222befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard return 1; 2231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } else { 2241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* ALU instructions support almost everything */ 2251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák relevant = 0; 2261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for(i = 0; i < 3; ++i) { 2271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int swz = GET_SWZ(reg.Swizzle, i); 2281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (swz != RC_SWIZZLE_UNUSED && swz != RC_SWIZZLE_ZERO) 2291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák relevant |= 1 << i; 2301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if ((reg.Negate & relevant) && ((reg.Negate & relevant) != relevant)) 2321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 0; 2331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return 1; 2351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 2371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/** 2391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Split source register access. 2401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 2411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * The only thing we *cannot* do in an ALU instruction is per-component 2421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * negation. 2431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 2441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void r500_swizzle_split(struct rc_src_register src, unsigned int usemask, 2451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_swizzle_split * split) 2461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 2471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int negatebase[2] = { 0, 0 }; 2481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int i; 2491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for(i = 0; i < 4; ++i) { 2511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int swz = GET_SWZ(src.Swizzle, i); 2521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (swz == RC_SWIZZLE_UNUSED || !GET_BIT(usemask, i)) 2531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák continue; 2541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák negatebase[GET_BIT(src.Negate, i)] |= 1 << i; 2551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák split->NumPhases = 0; 2581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for(i = 0; i <= 1; ++i) { 2601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (!negatebase[i]) 2611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák continue; 2621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák split->Phase[split->NumPhases++] = negatebase[i]; 2641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 2661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct rc_swizzle_caps r500_swizzle_caps = { 2681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák .IsNative = r500_swizzle_is_native, 2691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák .Split = r500_swizzle_split 2701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}; 2711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic char *toswiz(int swiz_val) { 2731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(swiz_val) { 2741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 0: return "R"; 2751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 1: return "G"; 2761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 2: return "B"; 2771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 3: return "A"; 2781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 4: return "0"; 2791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 5: return "H"; 2801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 6: return "1"; 2811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 7: return "U"; 2821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 2831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return NULL; 2841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 2851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic char *toop(int op_val) 2871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 2881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char *str = NULL; 2891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch (op_val) { 2901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 0: str = "MAD"; break; 2911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 1: str = "DP3"; break; 2921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 2: str = "DP4"; break; 2931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 3: str = "D2A"; break; 2941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 4: str = "MIN"; break; 2951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 5: str = "MAX"; break; 2961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 6: str = "Reserved"; break; 2971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 7: str = "CND"; break; 2981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 8: str = "CMP"; break; 2991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 9: str = "FRC"; break; 3001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 10: str = "SOP"; break; 3011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 11: str = "MDH"; break; 3021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 12: str = "MDV"; break; 3031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 3041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return str; 3051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 3061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 3071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic char *to_alpha_op(int op_val) 3081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 3091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char *str = NULL; 3101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch (op_val) { 3111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 0: str = "MAD"; break; 3121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 1: str = "DP"; break; 3131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 2: str = "MIN"; break; 3141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 3: str = "MAX"; break; 3151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 4: str = "Reserved"; break; 3161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 5: str = "CND"; break; 3171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 6: str = "CMP"; break; 3181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 7: str = "FRC"; break; 3191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 8: str = "EX2"; break; 3201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 9: str = "LN2"; break; 3211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 10: str = "RCP"; break; 3221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 11: str = "RSQ"; break; 3231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 12: str = "SIN"; break; 3241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 13: str = "COS"; break; 3251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 14: str = "MDH"; break; 3261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 15: str = "MDV"; break; 3271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 3281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return str; 3291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 3301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 3311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic char *to_mask(int val) 3321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 3331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char *str = NULL; 3341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(val) { 3351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 0: str = "NONE"; break; 3361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 1: str = "R"; break; 3371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 2: str = "G"; break; 3381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 3: str = "RG"; break; 3391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 4: str = "B"; break; 3401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 5: str = "RB"; break; 3411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 6: str = "GB"; break; 3421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 7: str = "RGB"; break; 3431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 8: str = "A"; break; 3441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 9: str = "AR"; break; 3451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 10: str = "AG"; break; 3461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 11: str = "ARG"; break; 3471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 12: str = "AB"; break; 3481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 13: str = "ARB"; break; 3491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 14: str = "AGB"; break; 3501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 15: str = "ARGB"; break; 3511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 3521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return str; 3531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 3541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 3551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic char *to_texop(int val) 3561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 3571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(val) { 3581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 0: return "NOP"; 3591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 1: return "LD"; 3601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 2: return "TEXKILL"; 3611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 3: return "PROJ"; 3621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 4: return "LODBIAS"; 3631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 5: return "LOD"; 3641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 6: return "DXDY"; 3651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 3661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return NULL; 3671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 3681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 3691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid r500FragmentProgramDump(struct radeon_compiler *c, void *user) 3701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 3711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct r300_fragment_program_compiler *compiler = (struct r300_fragment_program_compiler*)c; 3721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct r500_fragment_program_code *code = &compiler->code->code.r500; 3731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int n, i; 3741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák uint32_t inst; 3751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák uint32_t inst0; 3761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák char *str = NULL; 3771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "R500 Fragment Program:\n--------\n"); 3781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 3791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for (n = 0; n < code->inst_end+1; n++) { 3801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst0 = inst = code->inst[n].inst0; 3811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"%d\t0:CMN_INST 0x%08x:", n, inst); 3821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(inst & 0x3) { 3831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_INST_TYPE_ALU: str = "ALU"; break; 3841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_INST_TYPE_OUT: str = "OUT"; break; 3851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_INST_TYPE_FC: str = "FC"; break; 3861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_INST_TYPE_TEX: str = "TEX"; break; 3871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák }; 3881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"%s %s %s %s %s ", str, 3891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst & R500_INST_TEX_SEM_WAIT ? "TEX_WAIT" : "", 3901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst & R500_INST_LAST ? "LAST" : "", 3911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst & R500_INST_NOP ? "NOP" : "", 3921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst & R500_INST_ALU_WAIT ? "ALU WAIT" : ""); 3931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"wmask: %s omask: %s\n", to_mask((inst >> 11) & 0xf), 3941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák to_mask((inst >> 15) & 0xf)); 3951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 3961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(inst0 & 0x3) { 3971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_INST_TYPE_ALU: 3981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_INST_TYPE_OUT: 3991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"\t1:RGB_ADDR 0x%08x:", code->inst[n].inst1); 4001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst1; 4011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 4021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"Addr0: %d%c, Addr1: %d%c, Addr2: %d%c, srcp:%d\n", 4031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst & 0xff, (inst & (1<<8)) ? 'c' : 't', 4041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 10) & 0xff, (inst & (1<<18)) ? 'c' : 't', 4051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 20) & 0xff, (inst & (1<<28)) ? 'c' : 't', 4061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 30)); 4071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 4081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"\t2:ALPHA_ADDR 0x%08x:", code->inst[n].inst2); 4091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst2; 4101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"Addr0: %d%c, Addr1: %d%c, Addr2: %d%c, srcp:%d\n", 4111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst & 0xff, (inst & (1<<8)) ? 'c' : 't', 4121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 10) & 0xff, (inst & (1<<18)) ? 'c' : 't', 4131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 20) & 0xff, (inst & (1<<28)) ? 'c' : 't', 4141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 30)); 4151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"\t3 RGB_INST: 0x%08x:", code->inst[n].inst3); 4161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst3; 4171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"rgb_A_src:%d %s/%s/%s %d rgb_B_src:%d %s/%s/%s %d targ: %d\n", 4181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst) & 0x3, toswiz((inst >> 2) & 0x7), toswiz((inst >> 5) & 0x7), toswiz((inst >> 8) & 0x7), 4191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 11) & 0x3, 4201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 13) & 0x3, toswiz((inst >> 15) & 0x7), toswiz((inst >> 18) & 0x7), toswiz((inst >> 21) & 0x7), 4211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 24) & 0x3, (inst >> 29) & 0x3); 4221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 4231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 4241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"\t4 ALPHA_INST:0x%08x:", code->inst[n].inst4); 4251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst4; 4261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"%s dest:%d%s alp_A_src:%d %s %d alp_B_src:%d %s %d targ %d w:%d\n", to_alpha_op(inst & 0xf), 4271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 4) & 0x7f, inst & (1<<11) ? "(rel)":"", 4281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 12) & 0x3, toswiz((inst >> 14) & 0x7), (inst >> 17) & 0x3, 4291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 19) & 0x3, toswiz((inst >> 21) & 0x7), (inst >> 24) & 0x3, 4301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 29) & 0x3, 4311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 31) & 0x1); 4321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 4331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"\t5 RGBA_INST: 0x%08x:", code->inst[n].inst5); 4341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst5; 4351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"%s dest:%d%s rgb_C_src:%d %s/%s/%s %d alp_C_src:%d %s %d\n", toop(inst & 0xf), 4361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 4) & 0x7f, inst & (1<<11) ? "(rel)":"", 4371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 12) & 0x3, toswiz((inst >> 14) & 0x7), toswiz((inst >> 17) & 0x7), toswiz((inst >> 20) & 0x7), 4381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 23) & 0x3, 4391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 25) & 0x3, toswiz((inst >> 27) & 0x7), (inst >> 30) & 0x3); 4401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_INST_TYPE_FC: 4421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "\t2:FC_INST 0x%08x:", code->inst[n].inst2); 4431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst2; 4441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* JUMP_FUNC JUMP_ANY*/ 4451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "0x%02x %1x ", inst >> 8 & 0xff, 4461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst & R500_FC_JUMP_ANY) >> 5); 4471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 4481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* OP */ 4491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(inst & 0x7){ 4501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_OP_JUMP: 4511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "JUMP"); 4521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_OP_LOOP: 4541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "LOOP"); 4551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_OP_ENDLOOP: 4571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "ENDLOOP"); 4581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_OP_REP: 4601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "REP"); 4611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_OP_ENDREP: 4631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "ENDREP"); 4641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_OP_BREAKLOOP: 4661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "BREAKLOOP"); 4671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_OP_BREAKREP: 4691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "BREAKREP"); 4701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_OP_CONTINUE: 4721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "CONTINUE"); 4731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 4751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr," "); 4761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* A_OP */ 4771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(inst & (0x3 << 6)){ 4781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_A_OP_NONE: 4791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "NONE"); 4801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_A_OP_POP: 4821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "POP"); 4831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_A_OP_PUSH: 4851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "PUSH"); 4861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 4881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* B_OP0 B_OP1 */ 4891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for(i=0; i<2; i++){ 4901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, " "); 4911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák switch(inst & (0x3 << (24 + (i * 2)))){ 4921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* R500_FC_B_OP0_NONE 4931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * R500_FC_B_OP1_NONE */ 4941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case 0: 4951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "NONE"); 4961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 4971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_B_OP0_DECR: 4981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_B_OP1_DECR: 4991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "DECR"); 5001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 5011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_B_OP0_INCR: 5021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_FC_B_OP1_INCR: 5031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "INCR"); 5041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 5051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 5061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 5071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /*POP_CNT B_ELSE */ 5081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, " %d %1x", (inst >> 16) & 0x1f, (inst & R500_FC_B_ELSE) >> 4); 5091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst3; 5101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* JUMP_ADDR */ 5111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, " %d", inst >> 16); 5121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 5131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if(code->inst[n].inst2 & R500_FC_IGNORE_UNCOVERED){ 5141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, " IGN_UNC"); 5151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 5161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst3; 5171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "\n\t3:FC_ADDR 0x%08x:", inst); 5181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr, "BOOL: 0x%02x, INT: 0x%02x, JUMP_ADDR: %d, JMP_GLBL: %1x\n", 5191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst & 0x1f, (inst >> 8) & 0x1f, (inst >> 16) & 0x1ff, inst >> 31); 5201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 5211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák case R500_INST_TYPE_TEX: 5221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst1; 5231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"\t1:TEX_INST: 0x%08x: id: %d op:%s, %s, %s %s\n", inst, (inst >> 16) & 0xf, 5241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák to_texop((inst >> 22) & 0x7), (inst & (1<<25)) ? "ACQ" : "", 5251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst & (1<<26)) ? "IGNUNC" : "", (inst & (1<<27)) ? "UNSCALED" : "SCALED"); 5261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = code->inst[n].inst2; 5271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"\t2:TEX_ADDR: 0x%08x: src: %d%s %s/%s/%s/%s dst: %d%s %s/%s/%s/%s\n", inst, 5281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst & 127, inst & (1<<7) ? "(rel)" : "", 5291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák toswiz((inst >> 8) & 0x3), toswiz((inst >> 10) & 0x3), 5301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák toswiz((inst >> 12) & 0x3), toswiz((inst >> 14) & 0x3), 5311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (inst >> 16) & 127, inst & (1<<23) ? "(rel)" : "", 5321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák toswiz((inst >> 24) & 0x3), toswiz((inst >> 26) & 0x3), 5331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák toswiz((inst >> 28) & 0x3), toswiz((inst >> 30) & 0x3)); 5341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 5351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"\t3:TEX_DXDY: 0x%08x\n", code->inst[n].inst3); 5361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák break; 5371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 5381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák fprintf(stderr,"\n"); 5391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 5401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 5411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 542