11c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/* 21c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Copyright (C) 2009 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_OPCODES_H 291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#define RADEON_OPCODES_H 301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include <assert.h> 321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák/** 341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * Opcodes understood by the Radeon compiler. 351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšáktypedef enum { 371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_NOP = 0, 381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_ILLEGAL_OPCODE, 391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = abs(src0.c); */ 411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_ABS, 421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src0.c + src1.c; */ 441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_ADD, 451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction: load address register 471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * dst.x = floor(src.x), where dst must be an address register */ 481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_ARL, 491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = ceil(src0.c) */ 511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_CEIL, 521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = clamp(src0.c, src1.c, src2.c) */ 541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_CLAMP, 551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src0.c < 0.0 ? src1.c : src2.c */ 571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_CMP, 581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src2.c > 0.5 ? src0.c : src1.c */ 601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_CND, 611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = cos(src0.x) */ 631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_COS, 641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction: take vec4 partial derivative in X direction 661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * dst.c = d src0.c / dx */ 671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_DDX, 681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction: take vec4 partial derivative in Y direction 701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * dst.c = d src0.c / dy */ 711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_DDY, 721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = src0.x*src1.x + src0.y*src1.y */ 741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_DP2, 751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = src0.x*src1.x + src0.y*src1.y + src0.z*src1.z */ 771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_DP3, 781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = src0.x*src1.x + src0.y*src1.y + src0.z*src1.z + src0.w*src1.w */ 801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_DP4, 811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = src0.x*src1.x + src0.y*src1.y + src0.z*src1.z + src1.w */ 831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_DPH, 841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction, see ARB_fragment_program */ 861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_DST, 871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = 2**src0.x */ 891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_EX2, 901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction, see ARB_vertex_program */ 921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_EXP, 931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = floor(src0.c) */ 951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_FLR, 961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src0.c - floor(src0.c) */ 981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_FRC, 991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction: stop execution if any component of src0 is negative */ 1011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_KIL, 1021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = log_2(src0.x) */ 1041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_LG2, 1051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction, see ARB_vertex_program */ 1071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_LIT, 1081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction, see ARB_vertex_program */ 1101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_LOG, 1111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src0.c*src1.c + (1 - src0.c)*src2.c */ 1131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_LRP, 1141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src0.c*src1.c + src2.c */ 1161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_MAD, 1171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = max(src0.c, src1.c) */ 1191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_MAX, 1201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = min(src0.c, src1.c) */ 1221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_MIN, 1231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src0.c */ 1251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_MOV, 1261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src0.c*src1.c */ 1281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_MUL, 1291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = src0.x ** src1.x */ 1311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_POW, 1321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = 1 / src0.x */ 1341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_RCP, 1351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1363d32e589879806297258e36ea80aae5044293ca3Tom Stellard /** vec4 instruction: dst.c = floor(src0.c + 0.5) */ 1373d32e589879806297258e36ea80aae5044293ca3Tom Stellard RC_OPCODE_ROUND, 1383d32e589879806297258e36ea80aae5044293ca3Tom Stellard 1391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = 1 / sqrt(src0.x) */ 1401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_RSQ, 1411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction, see ARB_fragment_program */ 1431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SCS, 1441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = (src0.c == src1.c) ? 1.0 : 0.0 */ 1461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SEQ, 1471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = 0.0 */ 1491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SFL, 1501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = (src0.c >= src1.c) ? 1.0 : 0.0 */ 1521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SGE, 1531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = (src0.c > src1.c) ? 1.0 : 0.0 */ 1551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SGT, 1561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** scalar instruction: dst = sin(src0.x) */ 1581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SIN, 1591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = (src0.c <= src1.c) ? 1.0 : 0.0 */ 1611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SLE, 1621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = (src0.c < src1.c) ? 1.0 : 0.0 */ 1641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SLT, 1651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = (src0.c != src1.c) ? 1.0 : 0.0 */ 1671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SNE, 1681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = (src0.c < 0 ?) -1 : ((src0.c > 0) : 1 : 0) */ 1701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SSG, 1711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src0.c - src1.c */ 1731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SUB, 1741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** vec4 instruction: dst.c = src0.c */ 1761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_SWZ, 1771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1787f0fcf17c342dcb788c2182b20973c48806ee498Marek Olšák /** vec4 instruction: dst.c = (abs(src0.c) - fract(abs(src0.c))) * sgn(src0.c) */ 1797f0fcf17c342dcb788c2182b20973c48806ee498Marek Olšák RC_OPCODE_TRUNC, 1807f0fcf17c342dcb788c2182b20973c48806ee498Marek Olšák 1811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction, see ARB_fragment_program */ 1821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_XPD, 1831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_TEX, 1851c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_TXB, 1861c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_TXD, 1871c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_TXL, 1881c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_TXP, 1891c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1901c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** branch instruction: 1911c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * If src0.x != 0.0, continue with the next instruction; 1921c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * otherwise, jump to matching RC_OPCODE_ELSE or RC_OPCODE_ENDIF. 1931c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 1941c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_IF, 1951c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1961c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** branch instruction: jump to matching RC_OPCODE_ENDIF */ 1971c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_ELSE, 1981c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 1991c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** branch instruction: has no effect */ 2001c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_ENDIF, 2011c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2021c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_BGNLOOP, 2031c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2041c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_BRK, 2051c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2061c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_ENDLOOP, 2071c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2081c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_CONT, 2091c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction, used in R300-R500 fragment program pair instructions 2111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * indicates that the result of the alpha operation shall be replicated 2121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * across all other channels */ 2131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_REPL_ALPHA, 2141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** special instruction, used in R300-R500 fragment programs 2161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * to indicate the start of a block of texture instructions that 2171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * can run simultaneously. */ 2181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_BEGIN_TEX, 2191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** Stop execution of the shader (GLSL discard) */ 2211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák RC_OPCODE_KILP, 2221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 223b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard /* Vertex shader CF Instructions */ 224b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_ME_PRED_SEQ, 225b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_ME_PRED_SGT, 226b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_ME_PRED_SGE, 227b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_ME_PRED_SNEQ, 228b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_ME_PRED_SET_CLR, 229b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_ME_PRED_SET_INV, 230b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_ME_PRED_SET_POP, 231b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_ME_PRED_SET_RESTORE, 232b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard 233b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_VE_PRED_SEQ_PUSH, 234b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_VE_PRED_SGT_PUSH, 235b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_VE_PRED_SGE_PUSH, 236b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard RC_VE_PRED_SNEQ_PUSH, 237b2df031a959f36743527b9abc89913ce4f895de3Tom Stellard 2381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák MAX_RC_OPCODE 2391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} rc_opcode; 2401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct rc_opcode_info { 2431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák rc_opcode Opcode; 2441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák const char * Name; 2451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** true if the instruction reads from a texture. 2471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 2481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * \note This is false for the KIL instruction, even though KIL is 2491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * a texture instruction from a hardware point of view. */ 2501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int HasTexture:1; 2511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int NumSrcRegs:2; 2531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int HasDstReg:1; 2541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** true if this instruction affects control flow */ 2561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int IsFlowControl:1; 2571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** true if this is a vector instruction that operates on components in parallel 2591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * without any cross-component interaction */ 2601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int IsComponentwise:1; 2611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /** true if this instruction sources only its operands X components 2631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * to compute one result which is smeared across all output channels */ 2641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int IsStandardScalar:1; 2651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák}; 2661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákextern struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE]; 2681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic inline const struct rc_opcode_info * rc_get_opcode_info(rc_opcode opcode) 2701c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 2711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák assert((unsigned int)opcode < MAX_RC_OPCODE); 2721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák assert(rc_opcodes[opcode].Opcode == opcode); 2731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák return &rc_opcodes[opcode]; 2751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 2761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstruct rc_instruction; 2781c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2791c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákvoid rc_compute_sources_for_writemask( 2801c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák const struct rc_instruction *inst, 2811c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int writemask, 2821c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák unsigned int *srcmasks); 2831c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 2841c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#endif /* RADEON_OPCODES_H */ 285