11c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/* 21c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Copyright (C) 2008 Nicolai Haehnle. 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#ifndef __RADEON_PROGRAM_PAIR_H_ 291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#define __RADEON_PROGRAM_PAIR_H_ 301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_code.h" 321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_opcodes.h" 331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_program_constants.h" 341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct radeon_compiler; 361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/** 391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * \file 401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Represents a paired ALU instruction, as found in R300 and R500 411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * fragment programs. 421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Note that this representation is taking some liberties as far 441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * as register files are concerned, to allow separate register 451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * allocation. 461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Also note that there are some subtleties in that the semantics 481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * of certain opcodes are implicitly changed in this representation; 491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * see \ref rc_pair_translate 501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/* For rgb and alpha instructions when arg[n].Source = RC_PAIR_PRESUB_SRC, then 531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * the presubtract value will be used, and 541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * {RGB,Alpha}.Src[RC_PAIR_PRESUB_SRC].File will be set to RC_FILE_PRESUB. 551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#define RC_PAIR_PRESUB_SRC 3 571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct rc_pair_instruction_source { 591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Used:1; 60befcce264c8bf8fdac233e6a01cadc595a1d11d3Tom Stellard unsigned int File:4; 611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Index:RC_REGISTER_INDEX_BITS; 621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}; 631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct rc_pair_instruction_arg { 651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Source:2; 661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Swizzle:12; 671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Abs:1; 681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Negate:1; 691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}; 701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct rc_pair_sub_instruction { 721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Opcode:8; 731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int DestIndex:RC_REGISTER_INDEX_BITS; 741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int WriteMask:4; 751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Target:2; 761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int OutputWriteMask:3; 771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int DepthWriteMask:1; 781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Saturate:1; 79e945fb04d04c33da5e77d22d739c5740a522a61eTom Stellard unsigned int Omod:3; 801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_instruction_source Src[4]; 821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_instruction_arg Arg[3]; 831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}; 841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct rc_pair_instruction { 861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_sub_instruction RGB; 871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_sub_instruction Alpha; 881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int WriteALUResult:2; 901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int ALUResultCompare:3; 911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int Nop:1; 92163629fd05166b78d70c2c26f4a922b296e8999dTom Stellard unsigned int SemWait:1; 931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}; 941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšáktypedef void (*rc_pair_foreach_src_fn) 961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák (void *, struct rc_pair_instruction_source *); 971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/** 991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * General helper functions for dealing with the paired instruction format. 1001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 1011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/*@{*/ 1021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákint rc_pair_alloc_source(struct rc_pair_instruction *pair, 1031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int rgb, unsigned int alpha, 1041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rc_register_file file, unsigned int index); 1051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_pair_foreach_source_that_alpha_reads( 1071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_instruction * pair, 1081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák void * data, 1091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rc_pair_foreach_src_fn cb); 1101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_pair_foreach_source_that_rgb_reads( 1121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_instruction * pair, 1131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák void * data, 1141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rc_pair_foreach_src_fn cb); 1151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct rc_pair_instruction_source * rc_pair_get_src( 1171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_instruction * pair_inst, 1181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_instruction_arg * arg); 1191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákint rc_pair_get_src_index( 1211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_instruction * pair_inst, 1221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_pair_instruction_source * src); 1231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/*@}*/ 1241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/** 1271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Compiler passes that operate with the paired format. 1281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 1291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/*@{*/ 1301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct radeon_pair_handler; 1311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_pair_translate(struct radeon_compiler *cc, void *user); 1331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_pair_schedule(struct radeon_compiler *cc, void *user); 1341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_pair_regalloc(struct radeon_compiler *cc, void *user); 1351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_pair_regalloc_inputs_only(struct radeon_compiler *cc, void *user); 1361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_pair_remove_dead_sources(struct radeon_compiler *c, void *user); 1371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/*@}*/ 1381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#endif /* __RADEON_PROGRAM_PAIR_H_ */ 140