11c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/* 21c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Copyright 2010 Tom Stellard <tstellar@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/** 291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * \file 301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_rename_regs.h" 331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_compiler.h" 3507c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard#include "radeon_list.h" 361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_program.h" 3707c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard#include "radeon_variable.h" 381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/** 401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * This function renames registers in an attempt to get the code close to 411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * SSA form. After this function has completed, most of the register are only 421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * written to one time, with a few exceptions. 431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * This function assumes all the instructions are still of type 451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * RC_INSTRUCTION_NORMAL. 461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_rename_regs(struct radeon_compiler *c, void *user) 481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 4907c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard unsigned int used_length; 501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_instruction * inst; 511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned char * used; 5207c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard struct rc_list * variables; 5307c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard struct rc_list * var_ptr; 541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* XXX Remove this once the register allocation works with flow control. */ 561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák for(inst = c->Program.Instructions.Next; 571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst != &c->Program.Instructions; 581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák inst = inst->Next) { 591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (inst->U.I.Opcode == RC_OPCODE_BGNLOOP) 601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return; 611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák used_length = 2 * rc_recompute_ips(c); 641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák used = memory_pool_malloc(&c->Pool, sizeof(unsigned char) * used_length); 651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák memset(used, 0, sizeof(unsigned char) * used_length); 661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rc_get_used_temporaries(c, used, used_length); 6807c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard variables = rc_get_variables(c); 691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 7007c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard for (var_ptr = variables; var_ptr; var_ptr = var_ptr->Next) { 7107c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard unsigned new_index; 7207c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard unsigned writemask; 7307c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard struct rc_variable * var = var_ptr->Item; 741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 7507c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard if (var->Inst->U.I.DstReg.File != RC_FILE_TEMPORARY) { 761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák continue; 7707c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard } 781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák new_index = rc_find_free_temporary_list(c, used, used_length, 801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_MASK_XYZW); 811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák if (new_index < 0) { 821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rc_error(c, "Ran out of temporary registers\n"); 831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return; 841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 8607c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard writemask = rc_variable_writemask_sum(var); 8707c71d6ede4f2ad62bcaab8d3f84452485979e2eTom Stellard rc_variable_change_dst(var, new_index, writemask); 881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák } 891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 90