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