1bf215546Sopenharmony_ci/*
2bf215546Sopenharmony_ci * Copyright (C) 2009 Nicolai Haehnle.
3bf215546Sopenharmony_ci *
4bf215546Sopenharmony_ci * All Rights Reserved.
5bf215546Sopenharmony_ci *
6bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining
7bf215546Sopenharmony_ci * a copy of this software and associated documentation files (the
8bf215546Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
9bf215546Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
10bf215546Sopenharmony_ci * distribute, sublicense, and/or sell copies of the Software, and to
11bf215546Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
12bf215546Sopenharmony_ci * the following conditions:
13bf215546Sopenharmony_ci *
14bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the
15bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial
16bf215546Sopenharmony_ci * portions of the Software.
17bf215546Sopenharmony_ci *
18bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19bf215546Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20bf215546Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21bf215546Sopenharmony_ci * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22bf215546Sopenharmony_ci * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23bf215546Sopenharmony_ci * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24bf215546Sopenharmony_ci * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25bf215546Sopenharmony_ci *
26bf215546Sopenharmony_ci */
27bf215546Sopenharmony_ci
28bf215546Sopenharmony_ci#include "radeon_opcodes.h"
29bf215546Sopenharmony_ci#include "radeon_program.h"
30bf215546Sopenharmony_ci
31bf215546Sopenharmony_ci#include "radeon_program_constants.h"
32bf215546Sopenharmony_ci
33bf215546Sopenharmony_ci#include "util/compiler.h"
34bf215546Sopenharmony_ci
35bf215546Sopenharmony_ciconst struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE] = {
36bf215546Sopenharmony_ci	{
37bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_NOP,
38bf215546Sopenharmony_ci		.Name = "NOP"
39bf215546Sopenharmony_ci	},
40bf215546Sopenharmony_ci	{
41bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_ILLEGAL_OPCODE,
42bf215546Sopenharmony_ci		.Name = "ILLEGAL OPCODE"
43bf215546Sopenharmony_ci	},
44bf215546Sopenharmony_ci	{
45bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_ADD,
46bf215546Sopenharmony_ci		.Name = "ADD",
47bf215546Sopenharmony_ci		.NumSrcRegs = 2,
48bf215546Sopenharmony_ci		.HasDstReg = 1,
49bf215546Sopenharmony_ci		.IsComponentwise = 1
50bf215546Sopenharmony_ci	},
51bf215546Sopenharmony_ci	{
52bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_ARL,
53bf215546Sopenharmony_ci		.Name = "ARL",
54bf215546Sopenharmony_ci		.NumSrcRegs = 1,
55bf215546Sopenharmony_ci		.HasDstReg = 1
56bf215546Sopenharmony_ci	},
57bf215546Sopenharmony_ci	{
58bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_ARR,
59bf215546Sopenharmony_ci		.Name = "ARR",
60bf215546Sopenharmony_ci		.NumSrcRegs = 1,
61bf215546Sopenharmony_ci		.HasDstReg = 1
62bf215546Sopenharmony_ci	},
63bf215546Sopenharmony_ci	{
64bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_CEIL,
65bf215546Sopenharmony_ci		.Name = "CEIL",
66bf215546Sopenharmony_ci		.NumSrcRegs = 1,
67bf215546Sopenharmony_ci		.HasDstReg = 1,
68bf215546Sopenharmony_ci		.IsComponentwise = 1
69bf215546Sopenharmony_ci	},
70bf215546Sopenharmony_ci	{
71bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_CMP,
72bf215546Sopenharmony_ci		.Name = "CMP",
73bf215546Sopenharmony_ci		.NumSrcRegs = 3,
74bf215546Sopenharmony_ci		.HasDstReg = 1,
75bf215546Sopenharmony_ci		.IsComponentwise = 1
76bf215546Sopenharmony_ci	},
77bf215546Sopenharmony_ci	{
78bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_CND,
79bf215546Sopenharmony_ci		.Name = "CND",
80bf215546Sopenharmony_ci		.NumSrcRegs = 3,
81bf215546Sopenharmony_ci		.HasDstReg = 1,
82bf215546Sopenharmony_ci		.IsComponentwise = 1
83bf215546Sopenharmony_ci	},
84bf215546Sopenharmony_ci	{
85bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_COS,
86bf215546Sopenharmony_ci		.Name = "COS",
87bf215546Sopenharmony_ci		.NumSrcRegs = 1,
88bf215546Sopenharmony_ci		.HasDstReg = 1,
89bf215546Sopenharmony_ci		.IsStandardScalar = 1
90bf215546Sopenharmony_ci	},
91bf215546Sopenharmony_ci	{
92bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_DDX,
93bf215546Sopenharmony_ci		.Name = "DDX",
94bf215546Sopenharmony_ci		.NumSrcRegs = 2,
95bf215546Sopenharmony_ci		.HasDstReg = 1,
96bf215546Sopenharmony_ci		.IsComponentwise = 1
97bf215546Sopenharmony_ci	},
98bf215546Sopenharmony_ci	{
99bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_DDY,
100bf215546Sopenharmony_ci		.Name = "DDY",
101bf215546Sopenharmony_ci		.NumSrcRegs = 2,
102bf215546Sopenharmony_ci		.HasDstReg = 1,
103bf215546Sopenharmony_ci		.IsComponentwise = 1
104bf215546Sopenharmony_ci	},
105bf215546Sopenharmony_ci	{
106bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_DP2,
107bf215546Sopenharmony_ci		.Name = "DP2",
108bf215546Sopenharmony_ci		.NumSrcRegs = 2,
109bf215546Sopenharmony_ci		.HasDstReg = 1
110bf215546Sopenharmony_ci	},
111bf215546Sopenharmony_ci	{
112bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_DP3,
113bf215546Sopenharmony_ci		.Name = "DP3",
114bf215546Sopenharmony_ci		.NumSrcRegs = 2,
115bf215546Sopenharmony_ci		.HasDstReg = 1
116bf215546Sopenharmony_ci	},
117bf215546Sopenharmony_ci	{
118bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_DP4,
119bf215546Sopenharmony_ci		.Name = "DP4",
120bf215546Sopenharmony_ci		.NumSrcRegs = 2,
121bf215546Sopenharmony_ci		.HasDstReg = 1
122bf215546Sopenharmony_ci	},
123bf215546Sopenharmony_ci	{
124bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_DST,
125bf215546Sopenharmony_ci		.Name = "DST",
126bf215546Sopenharmony_ci		.NumSrcRegs = 2,
127bf215546Sopenharmony_ci		.HasDstReg = 1
128bf215546Sopenharmony_ci	},
129bf215546Sopenharmony_ci	{
130bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_EX2,
131bf215546Sopenharmony_ci		.Name = "EX2",
132bf215546Sopenharmony_ci		.NumSrcRegs = 1,
133bf215546Sopenharmony_ci		.HasDstReg = 1,
134bf215546Sopenharmony_ci		.IsStandardScalar = 1
135bf215546Sopenharmony_ci	},
136bf215546Sopenharmony_ci	{
137bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_EXP,
138bf215546Sopenharmony_ci		.Name = "EXP",
139bf215546Sopenharmony_ci		.NumSrcRegs = 1,
140bf215546Sopenharmony_ci		.HasDstReg = 1
141bf215546Sopenharmony_ci	},
142bf215546Sopenharmony_ci	{
143bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_FLR,
144bf215546Sopenharmony_ci		.Name = "FLR",
145bf215546Sopenharmony_ci		.NumSrcRegs = 1,
146bf215546Sopenharmony_ci		.HasDstReg = 1,
147bf215546Sopenharmony_ci		.IsComponentwise = 1
148bf215546Sopenharmony_ci	},
149bf215546Sopenharmony_ci	{
150bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_FRC,
151bf215546Sopenharmony_ci		.Name = "FRC",
152bf215546Sopenharmony_ci		.NumSrcRegs = 1,
153bf215546Sopenharmony_ci		.HasDstReg = 1,
154bf215546Sopenharmony_ci		.IsComponentwise = 1
155bf215546Sopenharmony_ci	},
156bf215546Sopenharmony_ci	{
157bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_KIL,
158bf215546Sopenharmony_ci		.Name = "KIL",
159bf215546Sopenharmony_ci		.NumSrcRegs = 1
160bf215546Sopenharmony_ci	},
161bf215546Sopenharmony_ci	{
162bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_LG2,
163bf215546Sopenharmony_ci		.Name = "LG2",
164bf215546Sopenharmony_ci		.NumSrcRegs = 1,
165bf215546Sopenharmony_ci		.HasDstReg = 1,
166bf215546Sopenharmony_ci		.IsStandardScalar = 1
167bf215546Sopenharmony_ci	},
168bf215546Sopenharmony_ci	{
169bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_LIT,
170bf215546Sopenharmony_ci		.Name = "LIT",
171bf215546Sopenharmony_ci		.NumSrcRegs = 1,
172bf215546Sopenharmony_ci		.HasDstReg = 1
173bf215546Sopenharmony_ci	},
174bf215546Sopenharmony_ci	{
175bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_LOG,
176bf215546Sopenharmony_ci		.Name = "LOG",
177bf215546Sopenharmony_ci		.NumSrcRegs = 1,
178bf215546Sopenharmony_ci		.HasDstReg = 1
179bf215546Sopenharmony_ci	},
180bf215546Sopenharmony_ci	{
181bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_LRP,
182bf215546Sopenharmony_ci		.Name = "LRP",
183bf215546Sopenharmony_ci		.NumSrcRegs = 3,
184bf215546Sopenharmony_ci		.HasDstReg = 1,
185bf215546Sopenharmony_ci		.IsComponentwise = 1
186bf215546Sopenharmony_ci	},
187bf215546Sopenharmony_ci	{
188bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_MAD,
189bf215546Sopenharmony_ci		.Name = "MAD",
190bf215546Sopenharmony_ci		.NumSrcRegs = 3,
191bf215546Sopenharmony_ci		.HasDstReg = 1,
192bf215546Sopenharmony_ci		.IsComponentwise = 1
193bf215546Sopenharmony_ci	},
194bf215546Sopenharmony_ci	{
195bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_MAX,
196bf215546Sopenharmony_ci		.Name = "MAX",
197bf215546Sopenharmony_ci		.NumSrcRegs = 2,
198bf215546Sopenharmony_ci		.HasDstReg = 1,
199bf215546Sopenharmony_ci		.IsComponentwise = 1
200bf215546Sopenharmony_ci	},
201bf215546Sopenharmony_ci	{
202bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_MIN,
203bf215546Sopenharmony_ci		.Name = "MIN",
204bf215546Sopenharmony_ci		.NumSrcRegs = 2,
205bf215546Sopenharmony_ci		.HasDstReg = 1,
206bf215546Sopenharmony_ci		.IsComponentwise = 1
207bf215546Sopenharmony_ci	},
208bf215546Sopenharmony_ci	{
209bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_MOV,
210bf215546Sopenharmony_ci		.Name = "MOV",
211bf215546Sopenharmony_ci		.NumSrcRegs = 1,
212bf215546Sopenharmony_ci		.HasDstReg = 1,
213bf215546Sopenharmony_ci		.IsComponentwise = 1
214bf215546Sopenharmony_ci	},
215bf215546Sopenharmony_ci	{
216bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_MUL,
217bf215546Sopenharmony_ci		.Name = "MUL",
218bf215546Sopenharmony_ci		.NumSrcRegs = 2,
219bf215546Sopenharmony_ci		.HasDstReg = 1,
220bf215546Sopenharmony_ci		.IsComponentwise = 1
221bf215546Sopenharmony_ci	},
222bf215546Sopenharmony_ci	{
223bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_POW,
224bf215546Sopenharmony_ci		.Name = "POW",
225bf215546Sopenharmony_ci		.NumSrcRegs = 2,
226bf215546Sopenharmony_ci		.HasDstReg = 1,
227bf215546Sopenharmony_ci		.IsStandardScalar = 1
228bf215546Sopenharmony_ci	},
229bf215546Sopenharmony_ci	{
230bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_RCP,
231bf215546Sopenharmony_ci		.Name = "RCP",
232bf215546Sopenharmony_ci		.NumSrcRegs = 1,
233bf215546Sopenharmony_ci		.HasDstReg = 1,
234bf215546Sopenharmony_ci		.IsStandardScalar = 1
235bf215546Sopenharmony_ci	},
236bf215546Sopenharmony_ci	{
237bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_ROUND,
238bf215546Sopenharmony_ci		.Name = "ROUND",
239bf215546Sopenharmony_ci		.NumSrcRegs = 1,
240bf215546Sopenharmony_ci		.HasDstReg = 1,
241bf215546Sopenharmony_ci		.IsComponentwise = 1
242bf215546Sopenharmony_ci	},
243bf215546Sopenharmony_ci	{
244bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_RSQ,
245bf215546Sopenharmony_ci		.Name = "RSQ",
246bf215546Sopenharmony_ci		.NumSrcRegs = 1,
247bf215546Sopenharmony_ci		.HasDstReg = 1,
248bf215546Sopenharmony_ci		.IsStandardScalar = 1
249bf215546Sopenharmony_ci	},
250bf215546Sopenharmony_ci	{
251bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_SEQ,
252bf215546Sopenharmony_ci		.Name = "SEQ",
253bf215546Sopenharmony_ci		.NumSrcRegs = 2,
254bf215546Sopenharmony_ci		.HasDstReg = 1,
255bf215546Sopenharmony_ci		.IsComponentwise = 1
256bf215546Sopenharmony_ci	},
257bf215546Sopenharmony_ci	{
258bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_SGE,
259bf215546Sopenharmony_ci		.Name = "SGE",
260bf215546Sopenharmony_ci		.NumSrcRegs = 2,
261bf215546Sopenharmony_ci		.HasDstReg = 1,
262bf215546Sopenharmony_ci		.IsComponentwise = 1
263bf215546Sopenharmony_ci	},
264bf215546Sopenharmony_ci	{
265bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_SGT,
266bf215546Sopenharmony_ci		.Name = "SGT",
267bf215546Sopenharmony_ci		.NumSrcRegs = 2,
268bf215546Sopenharmony_ci		.HasDstReg = 1,
269bf215546Sopenharmony_ci		.IsComponentwise = 1
270bf215546Sopenharmony_ci	},
271bf215546Sopenharmony_ci	{
272bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_SIN,
273bf215546Sopenharmony_ci		.Name = "SIN",
274bf215546Sopenharmony_ci		.NumSrcRegs = 1,
275bf215546Sopenharmony_ci		.HasDstReg = 1,
276bf215546Sopenharmony_ci		.IsStandardScalar = 1
277bf215546Sopenharmony_ci	},
278bf215546Sopenharmony_ci	{
279bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_SLE,
280bf215546Sopenharmony_ci		.Name = "SLE",
281bf215546Sopenharmony_ci		.NumSrcRegs = 2,
282bf215546Sopenharmony_ci		.HasDstReg = 1,
283bf215546Sopenharmony_ci		.IsComponentwise = 1
284bf215546Sopenharmony_ci	},
285bf215546Sopenharmony_ci	{
286bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_SLT,
287bf215546Sopenharmony_ci		.Name = "SLT",
288bf215546Sopenharmony_ci		.NumSrcRegs = 2,
289bf215546Sopenharmony_ci		.HasDstReg = 1,
290bf215546Sopenharmony_ci		.IsComponentwise = 1
291bf215546Sopenharmony_ci	},
292bf215546Sopenharmony_ci	{
293bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_SNE,
294bf215546Sopenharmony_ci		.Name = "SNE",
295bf215546Sopenharmony_ci		.NumSrcRegs = 2,
296bf215546Sopenharmony_ci		.HasDstReg = 1,
297bf215546Sopenharmony_ci		.IsComponentwise = 1
298bf215546Sopenharmony_ci	},
299bf215546Sopenharmony_ci	{
300bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_SSG,
301bf215546Sopenharmony_ci		.Name = "SSG",
302bf215546Sopenharmony_ci		.NumSrcRegs = 1,
303bf215546Sopenharmony_ci		.HasDstReg = 1,
304bf215546Sopenharmony_ci		.IsComponentwise = 1
305bf215546Sopenharmony_ci	},
306bf215546Sopenharmony_ci	{
307bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_SUB,
308bf215546Sopenharmony_ci		.Name = "SUB",
309bf215546Sopenharmony_ci		.NumSrcRegs = 2,
310bf215546Sopenharmony_ci		.HasDstReg = 1,
311bf215546Sopenharmony_ci		.IsComponentwise = 1
312bf215546Sopenharmony_ci	},
313bf215546Sopenharmony_ci	{
314bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_TRUNC,
315bf215546Sopenharmony_ci		.Name = "TRUNC",
316bf215546Sopenharmony_ci		.NumSrcRegs = 1,
317bf215546Sopenharmony_ci		.HasDstReg = 1,
318bf215546Sopenharmony_ci		.IsComponentwise = 1
319bf215546Sopenharmony_ci	},
320bf215546Sopenharmony_ci	{
321bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_TEX,
322bf215546Sopenharmony_ci		.Name = "TEX",
323bf215546Sopenharmony_ci		.HasTexture = 1,
324bf215546Sopenharmony_ci		.NumSrcRegs = 1,
325bf215546Sopenharmony_ci		.HasDstReg = 1
326bf215546Sopenharmony_ci	},
327bf215546Sopenharmony_ci	{
328bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_TXB,
329bf215546Sopenharmony_ci		.Name = "TXB",
330bf215546Sopenharmony_ci		.HasTexture = 1,
331bf215546Sopenharmony_ci		.NumSrcRegs = 1,
332bf215546Sopenharmony_ci		.HasDstReg = 1
333bf215546Sopenharmony_ci	},
334bf215546Sopenharmony_ci	{
335bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_TXD,
336bf215546Sopenharmony_ci		.Name = "TXD",
337bf215546Sopenharmony_ci		.HasTexture = 1,
338bf215546Sopenharmony_ci		.NumSrcRegs = 3,
339bf215546Sopenharmony_ci		.HasDstReg = 1
340bf215546Sopenharmony_ci	},
341bf215546Sopenharmony_ci	{
342bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_TXL,
343bf215546Sopenharmony_ci		.Name = "TXL",
344bf215546Sopenharmony_ci		.HasTexture = 1,
345bf215546Sopenharmony_ci		.NumSrcRegs = 1,
346bf215546Sopenharmony_ci		.HasDstReg = 1
347bf215546Sopenharmony_ci	},
348bf215546Sopenharmony_ci	{
349bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_TXP,
350bf215546Sopenharmony_ci		.Name = "TXP",
351bf215546Sopenharmony_ci		.HasTexture = 1,
352bf215546Sopenharmony_ci		.NumSrcRegs = 1,
353bf215546Sopenharmony_ci		.HasDstReg = 1
354bf215546Sopenharmony_ci	},
355bf215546Sopenharmony_ci	{
356bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_IF,
357bf215546Sopenharmony_ci		.Name = "IF",
358bf215546Sopenharmony_ci		.IsFlowControl = 1,
359bf215546Sopenharmony_ci		.NumSrcRegs = 1
360bf215546Sopenharmony_ci	},
361bf215546Sopenharmony_ci	{
362bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_ELSE,
363bf215546Sopenharmony_ci		.Name = "ELSE",
364bf215546Sopenharmony_ci		.IsFlowControl = 1,
365bf215546Sopenharmony_ci		.NumSrcRegs = 0
366bf215546Sopenharmony_ci	},
367bf215546Sopenharmony_ci	{
368bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_ENDIF,
369bf215546Sopenharmony_ci		.Name = "ENDIF",
370bf215546Sopenharmony_ci		.IsFlowControl = 1,
371bf215546Sopenharmony_ci		.NumSrcRegs = 0
372bf215546Sopenharmony_ci	},
373bf215546Sopenharmony_ci	{
374bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_BGNLOOP,
375bf215546Sopenharmony_ci		.Name = "BGNLOOP",
376bf215546Sopenharmony_ci		.IsFlowControl = 1,
377bf215546Sopenharmony_ci		.NumSrcRegs = 0
378bf215546Sopenharmony_ci	},
379bf215546Sopenharmony_ci	{
380bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_BRK,
381bf215546Sopenharmony_ci		.Name = "BRK",
382bf215546Sopenharmony_ci		.IsFlowControl = 1,
383bf215546Sopenharmony_ci		.NumSrcRegs = 0
384bf215546Sopenharmony_ci	},
385bf215546Sopenharmony_ci	{
386bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_ENDLOOP,
387bf215546Sopenharmony_ci		.Name = "ENDLOOP",
388bf215546Sopenharmony_ci		.IsFlowControl = 1,
389bf215546Sopenharmony_ci		.NumSrcRegs = 0,
390bf215546Sopenharmony_ci	},
391bf215546Sopenharmony_ci	{
392bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_CONT,
393bf215546Sopenharmony_ci		.Name = "CONT",
394bf215546Sopenharmony_ci		.IsFlowControl = 1,
395bf215546Sopenharmony_ci		.NumSrcRegs = 0
396bf215546Sopenharmony_ci	},
397bf215546Sopenharmony_ci	{
398bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_REPL_ALPHA,
399bf215546Sopenharmony_ci		.Name = "REPL_ALPHA",
400bf215546Sopenharmony_ci		.HasDstReg = 1
401bf215546Sopenharmony_ci	},
402bf215546Sopenharmony_ci	{
403bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_BEGIN_TEX,
404bf215546Sopenharmony_ci		.Name = "BEGIN_TEX"
405bf215546Sopenharmony_ci	},
406bf215546Sopenharmony_ci	{
407bf215546Sopenharmony_ci		.Opcode = RC_OPCODE_KILP,
408bf215546Sopenharmony_ci		.Name = "KILP",
409bf215546Sopenharmony_ci	},
410bf215546Sopenharmony_ci	{
411bf215546Sopenharmony_ci		.Opcode = RC_ME_PRED_SEQ,
412bf215546Sopenharmony_ci		.Name = "ME_PRED_SEQ",
413bf215546Sopenharmony_ci		.NumSrcRegs = 1,
414bf215546Sopenharmony_ci		.HasDstReg = 1
415bf215546Sopenharmony_ci	},
416bf215546Sopenharmony_ci	{
417bf215546Sopenharmony_ci		.Opcode = RC_ME_PRED_SGT,
418bf215546Sopenharmony_ci		.Name = "ME_PRED_SGT",
419bf215546Sopenharmony_ci		.NumSrcRegs = 1,
420bf215546Sopenharmony_ci		.HasDstReg = 1
421bf215546Sopenharmony_ci	},
422bf215546Sopenharmony_ci	{
423bf215546Sopenharmony_ci		.Opcode = RC_ME_PRED_SGE,
424bf215546Sopenharmony_ci		.Name = "ME_PRED_SGE",
425bf215546Sopenharmony_ci		.NumSrcRegs = 1,
426bf215546Sopenharmony_ci		.HasDstReg = 1
427bf215546Sopenharmony_ci	},
428bf215546Sopenharmony_ci	{
429bf215546Sopenharmony_ci		.Opcode = RC_ME_PRED_SNEQ,
430bf215546Sopenharmony_ci		.Name = "ME_PRED_SNEQ",
431bf215546Sopenharmony_ci		.NumSrcRegs = 1,
432bf215546Sopenharmony_ci		.HasDstReg = 1
433bf215546Sopenharmony_ci	},
434bf215546Sopenharmony_ci	{
435bf215546Sopenharmony_ci		.Opcode = RC_ME_PRED_SET_CLR,
436bf215546Sopenharmony_ci		.Name = "ME_PRED_SET_CLEAR",
437bf215546Sopenharmony_ci		.NumSrcRegs = 1,
438bf215546Sopenharmony_ci		.HasDstReg = 1
439bf215546Sopenharmony_ci	},
440bf215546Sopenharmony_ci	{
441bf215546Sopenharmony_ci		.Opcode = RC_ME_PRED_SET_INV,
442bf215546Sopenharmony_ci		.Name = "ME_PRED_SET_INV",
443bf215546Sopenharmony_ci		.NumSrcRegs = 1,
444bf215546Sopenharmony_ci		.HasDstReg = 1
445bf215546Sopenharmony_ci	},
446bf215546Sopenharmony_ci	{
447bf215546Sopenharmony_ci		.Opcode = RC_ME_PRED_SET_POP,
448bf215546Sopenharmony_ci		.Name = "ME_PRED_SET_POP",
449bf215546Sopenharmony_ci		.NumSrcRegs = 1,
450bf215546Sopenharmony_ci		.HasDstReg = 1
451bf215546Sopenharmony_ci	},
452bf215546Sopenharmony_ci	{
453bf215546Sopenharmony_ci		.Opcode = RC_ME_PRED_SET_RESTORE,
454bf215546Sopenharmony_ci		.Name = "ME_PRED_SET_RESTORE",
455bf215546Sopenharmony_ci		.NumSrcRegs = 1,
456bf215546Sopenharmony_ci		.HasDstReg = 1
457bf215546Sopenharmony_ci	},
458bf215546Sopenharmony_ci	{
459bf215546Sopenharmony_ci		.Opcode = RC_VE_PRED_SEQ_PUSH,
460bf215546Sopenharmony_ci		.Name = "VE_PRED_SEQ_PUSH",
461bf215546Sopenharmony_ci		.NumSrcRegs = 2,
462bf215546Sopenharmony_ci		.HasDstReg = 1
463bf215546Sopenharmony_ci	},
464bf215546Sopenharmony_ci	{
465bf215546Sopenharmony_ci		.Opcode = RC_VE_PRED_SGT_PUSH,
466bf215546Sopenharmony_ci		.Name = "VE_PRED_SGT_PUSH",
467bf215546Sopenharmony_ci		.NumSrcRegs = 2,
468bf215546Sopenharmony_ci		.HasDstReg = 1
469bf215546Sopenharmony_ci	},
470bf215546Sopenharmony_ci	{
471bf215546Sopenharmony_ci		.Opcode = RC_VE_PRED_SGE_PUSH,
472bf215546Sopenharmony_ci		.Name = "VE_PRED_SGE_PUSH",
473bf215546Sopenharmony_ci		.NumSrcRegs = 2,
474bf215546Sopenharmony_ci		.HasDstReg = 1
475bf215546Sopenharmony_ci	},
476bf215546Sopenharmony_ci	{
477bf215546Sopenharmony_ci		.Opcode = RC_VE_PRED_SNEQ_PUSH,
478bf215546Sopenharmony_ci		.Name = "VE_PRED_SNEQ_PUSH",
479bf215546Sopenharmony_ci		.NumSrcRegs = 2,
480bf215546Sopenharmony_ci		.HasDstReg = 1
481bf215546Sopenharmony_ci	}
482bf215546Sopenharmony_ci};
483bf215546Sopenharmony_ci
484bf215546Sopenharmony_civoid rc_compute_sources_for_writemask(
485bf215546Sopenharmony_ci		const struct rc_instruction *inst,
486bf215546Sopenharmony_ci		unsigned int writemask,
487bf215546Sopenharmony_ci		unsigned int *srcmasks)
488bf215546Sopenharmony_ci{
489bf215546Sopenharmony_ci	const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->U.I.Opcode);
490bf215546Sopenharmony_ci	srcmasks[0] = 0;
491bf215546Sopenharmony_ci	srcmasks[1] = 0;
492bf215546Sopenharmony_ci	srcmasks[2] = 0;
493bf215546Sopenharmony_ci
494bf215546Sopenharmony_ci	if (opcode->Opcode == RC_OPCODE_KIL)
495bf215546Sopenharmony_ci		srcmasks[0] |= RC_MASK_XYZW;
496bf215546Sopenharmony_ci	else if (opcode->Opcode == RC_OPCODE_IF)
497bf215546Sopenharmony_ci		srcmasks[0] |= RC_MASK_X;
498bf215546Sopenharmony_ci
499bf215546Sopenharmony_ci	if (!writemask)
500bf215546Sopenharmony_ci		return;
501bf215546Sopenharmony_ci
502bf215546Sopenharmony_ci	if (opcode->IsComponentwise) {
503bf215546Sopenharmony_ci		for(unsigned int src = 0; src < opcode->NumSrcRegs; ++src)
504bf215546Sopenharmony_ci			srcmasks[src] |= writemask;
505bf215546Sopenharmony_ci	} else if (opcode->IsStandardScalar) {
506bf215546Sopenharmony_ci		for(unsigned int src = 0; src < opcode->NumSrcRegs; ++src)
507bf215546Sopenharmony_ci			srcmasks[src] |= writemask;
508bf215546Sopenharmony_ci	} else {
509bf215546Sopenharmony_ci		switch(opcode->Opcode) {
510bf215546Sopenharmony_ci		case RC_OPCODE_ARL:
511bf215546Sopenharmony_ci		case RC_OPCODE_ARR:
512bf215546Sopenharmony_ci			srcmasks[0] |= RC_MASK_X;
513bf215546Sopenharmony_ci			break;
514bf215546Sopenharmony_ci		case RC_OPCODE_DP2:
515bf215546Sopenharmony_ci			srcmasks[0] |= RC_MASK_XY;
516bf215546Sopenharmony_ci			srcmasks[1] |= RC_MASK_XY;
517bf215546Sopenharmony_ci			break;
518bf215546Sopenharmony_ci		case RC_OPCODE_DP3:
519bf215546Sopenharmony_ci			srcmasks[0] |= RC_MASK_XYZ;
520bf215546Sopenharmony_ci			srcmasks[1] |= RC_MASK_XYZ;
521bf215546Sopenharmony_ci			break;
522bf215546Sopenharmony_ci		case RC_OPCODE_DP4:
523bf215546Sopenharmony_ci			srcmasks[0] |= RC_MASK_XYZW;
524bf215546Sopenharmony_ci			srcmasks[1] |= RC_MASK_XYZW;
525bf215546Sopenharmony_ci			break;
526bf215546Sopenharmony_ci		case RC_OPCODE_TXB:
527bf215546Sopenharmony_ci		case RC_OPCODE_TXP:
528bf215546Sopenharmony_ci		case RC_OPCODE_TXL:
529bf215546Sopenharmony_ci			srcmasks[0] |= RC_MASK_W;
530bf215546Sopenharmony_ci			FALLTHROUGH;
531bf215546Sopenharmony_ci		case RC_OPCODE_TEX:
532bf215546Sopenharmony_ci			switch (inst->U.I.TexSrcTarget) {
533bf215546Sopenharmony_ci				case RC_TEXTURE_1D:
534bf215546Sopenharmony_ci					srcmasks[0] |= RC_MASK_X;
535bf215546Sopenharmony_ci					break;
536bf215546Sopenharmony_ci				case RC_TEXTURE_2D:
537bf215546Sopenharmony_ci				case RC_TEXTURE_RECT:
538bf215546Sopenharmony_ci				case RC_TEXTURE_1D_ARRAY:
539bf215546Sopenharmony_ci					srcmasks[0] |= RC_MASK_XY;
540bf215546Sopenharmony_ci					break;
541bf215546Sopenharmony_ci				case RC_TEXTURE_3D:
542bf215546Sopenharmony_ci				case RC_TEXTURE_CUBE:
543bf215546Sopenharmony_ci				case RC_TEXTURE_2D_ARRAY:
544bf215546Sopenharmony_ci					srcmasks[0] |= RC_MASK_XYZ;
545bf215546Sopenharmony_ci					break;
546bf215546Sopenharmony_ci			}
547bf215546Sopenharmony_ci			break;
548bf215546Sopenharmony_ci		case RC_OPCODE_TXD:
549bf215546Sopenharmony_ci			switch (inst->U.I.TexSrcTarget) {
550bf215546Sopenharmony_ci				case RC_TEXTURE_1D_ARRAY:
551bf215546Sopenharmony_ci					srcmasks[0] |= RC_MASK_Y;
552bf215546Sopenharmony_ci					FALLTHROUGH;
553bf215546Sopenharmony_ci				case RC_TEXTURE_1D:
554bf215546Sopenharmony_ci					srcmasks[0] |= RC_MASK_X;
555bf215546Sopenharmony_ci					srcmasks[1] |= RC_MASK_X;
556bf215546Sopenharmony_ci					srcmasks[2] |= RC_MASK_X;
557bf215546Sopenharmony_ci					break;
558bf215546Sopenharmony_ci				case RC_TEXTURE_2D_ARRAY:
559bf215546Sopenharmony_ci					srcmasks[0] |= RC_MASK_Z;
560bf215546Sopenharmony_ci					FALLTHROUGH;
561bf215546Sopenharmony_ci				case RC_TEXTURE_2D:
562bf215546Sopenharmony_ci				case RC_TEXTURE_RECT:
563bf215546Sopenharmony_ci					srcmasks[0] |= RC_MASK_XY;
564bf215546Sopenharmony_ci					srcmasks[1] |= RC_MASK_XY;
565bf215546Sopenharmony_ci					srcmasks[2] |= RC_MASK_XY;
566bf215546Sopenharmony_ci					break;
567bf215546Sopenharmony_ci				case RC_TEXTURE_3D:
568bf215546Sopenharmony_ci				case RC_TEXTURE_CUBE:
569bf215546Sopenharmony_ci					srcmasks[0] |= RC_MASK_XYZ;
570bf215546Sopenharmony_ci					srcmasks[1] |= RC_MASK_XYZ;
571bf215546Sopenharmony_ci					srcmasks[2] |= RC_MASK_XYZ;
572bf215546Sopenharmony_ci					break;
573bf215546Sopenharmony_ci			}
574bf215546Sopenharmony_ci			break;
575bf215546Sopenharmony_ci		case RC_OPCODE_DST:
576bf215546Sopenharmony_ci			srcmasks[0] |= RC_MASK_Y | RC_MASK_Z;
577bf215546Sopenharmony_ci			srcmasks[1] |= RC_MASK_Y | RC_MASK_W;
578bf215546Sopenharmony_ci			break;
579bf215546Sopenharmony_ci		case RC_OPCODE_EXP:
580bf215546Sopenharmony_ci		case RC_OPCODE_LOG:
581bf215546Sopenharmony_ci			srcmasks[0] |= RC_MASK_XY;
582bf215546Sopenharmony_ci			break;
583bf215546Sopenharmony_ci		case RC_OPCODE_LIT:
584bf215546Sopenharmony_ci			srcmasks[0] |= RC_MASK_X | RC_MASK_Y | RC_MASK_W;
585bf215546Sopenharmony_ci			break;
586bf215546Sopenharmony_ci		default:
587bf215546Sopenharmony_ci			break;
588bf215546Sopenharmony_ci		}
589bf215546Sopenharmony_ci	}
590bf215546Sopenharmony_ci}
591