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