1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 Nicolai Haehnle.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef RADEON_OPCODES_H
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RADEON_OPCODES_H
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h>
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Opcodes understood by the Radeon compiler.
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum {
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_NOP = 0,
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_ILLEGAL_OPCODE,
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = abs(src0.c); */
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_ABS,
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src0.c + src1.c; */
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_ADD,
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction: load address register
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * dst.x = floor(src.x), where dst must be an address register */
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_ARL,
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = ceil(src0.c) */
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_CEIL,
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = clamp(src0.c, src1.c, src2.c) */
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_CLAMP,
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src0.c < 0.0 ? src1.c : src2.c */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_CMP,
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src2.c > 0.5 ? src0.c : src1.c */
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_CND,
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = cos(src0.x) */
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_COS,
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction: take vec4 partial derivative in X direction
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * dst.c = d src0.c / dx */
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_DDX,
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction: take vec4 partial derivative in Y direction
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * dst.c = d src0.c / dy */
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_DDY,
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = src0.x*src1.x + src0.y*src1.y */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_DP2,
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = src0.x*src1.x + src0.y*src1.y + src0.z*src1.z */
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_DP3,
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = src0.x*src1.x + src0.y*src1.y + src0.z*src1.z + src0.w*src1.w */
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_DP4,
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = src0.x*src1.x + src0.y*src1.y + src0.z*src1.z + src1.w */
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_DPH,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction, see ARB_fragment_program */
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_DST,
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = 2**src0.x */
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_EX2,
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction, see ARB_vertex_program */
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_EXP,
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = floor(src0.c) */
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_FLR,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src0.c - floor(src0.c) */
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_FRC,
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction: stop execution if any component of src0 is negative */
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_KIL,
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = log_2(src0.x) */
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_LG2,
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction, see ARB_vertex_program */
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_LIT,
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction, see ARB_vertex_program */
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_LOG,
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src0.c*src1.c + (1 - src0.c)*src2.c */
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_LRP,
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src0.c*src1.c + src2.c */
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_MAD,
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = max(src0.c, src1.c) */
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_MAX,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = min(src0.c, src1.c) */
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_MIN,
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src0.c */
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_MOV,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src0.c*src1.c */
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_MUL,
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = src0.x ** src1.x */
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_POW,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = 1 / src0.x */
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_RCP,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = floor(src0.c + 0.5) */
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_ROUND,
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = 1 / sqrt(src0.x) */
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_RSQ,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction, see ARB_fragment_program */
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SCS,
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = (src0.c == src1.c) ? 1.0 : 0.0 */
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SEQ,
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = 0.0 */
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SFL,
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = (src0.c >= src1.c) ? 1.0 : 0.0 */
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SGE,
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = (src0.c > src1.c) ? 1.0 : 0.0 */
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SGT,
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** scalar instruction: dst = sin(src0.x) */
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SIN,
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = (src0.c <= src1.c) ? 1.0 : 0.0 */
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SLE,
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = (src0.c < src1.c) ? 1.0 : 0.0 */
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SLT,
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = (src0.c != src1.c) ? 1.0 : 0.0 */
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SNE,
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = (src0.c < 0 ?) -1 : ((src0.c > 0) : 1 : 0) */
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SSG,
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src0.c - src1.c */
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SUB,
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = src0.c */
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_SWZ,
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** vec4 instruction: dst.c = (abs(src0.c) - fract(abs(src0.c))) * sgn(src0.c) */
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_TRUNC,
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction, see ARB_fragment_program */
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_XPD,
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_TEX,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_TXB,
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_TXD,
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_TXL,
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_TXP,
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** branch instruction:
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * If src0.x != 0.0, continue with the next instruction;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * otherwise, jump to matching RC_OPCODE_ELSE or RC_OPCODE_ENDIF.
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_IF,
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** branch instruction: jump to matching RC_OPCODE_ENDIF */
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_ELSE,
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** branch instruction: has no effect */
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_ENDIF,
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_BGNLOOP,
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_BRK,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_ENDLOOP,
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_CONT,
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction, used in R300-R500 fragment program pair instructions
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * indicates that the result of the alpha operation shall be replicated
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * across all other channels */
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_REPL_ALPHA,
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** special instruction, used in R300-R500 fragment programs
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * to indicate the start of a block of texture instructions that
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * can run simultaneously. */
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_BEGIN_TEX,
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** Stop execution of the shader (GLSL discard) */
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_OPCODE_KILP,
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Vertex shader CF Instructions */
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_ME_PRED_SEQ,
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_ME_PRED_SGT,
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_ME_PRED_SGE,
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_ME_PRED_SNEQ,
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_ME_PRED_SET_CLR,
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_ME_PRED_SET_INV,
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_ME_PRED_SET_POP,
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_ME_PRED_SET_RESTORE,
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_VE_PRED_SEQ_PUSH,
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_VE_PRED_SGT_PUSH,
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_VE_PRED_SGE_PUSH,
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_VE_PRED_SNEQ_PUSH,
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	MAX_RC_OPCODE
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} rc_opcode;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_opcode_info {
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rc_opcode Opcode;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const char * Name;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** true if the instruction reads from a texture.
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * \note This is false for the KIL instruction, even though KIL is
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * a texture instruction from a hardware point of view. */
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int HasTexture:1;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int NumSrcRegs:2;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int HasDstReg:1;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** true if this instruction affects control flow */
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int IsFlowControl:1;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** true if this is a vector instruction that operates on components in parallel
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * without any cross-component interaction */
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int IsComponentwise:1;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/** true if this instruction sources only its operands X components
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * to compute one result which is smeared across all output channels */
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int IsStandardScalar:1;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE];
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline const struct rc_opcode_info * rc_get_opcode_info(rc_opcode opcode)
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert((unsigned int)opcode < MAX_RC_OPCODE);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(rc_opcodes[opcode].Opcode == opcode);
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return &rc_opcodes[opcode];
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_instruction;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_compute_sources_for_writemask(
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const struct rc_instruction *inst,
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned int writemask,
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned int *srcmasks);
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* RADEON_OPCODES_H */
285