1848b8605Smrg/**************************************************************************
2848b8605Smrg *
3848b8605Smrg * Copyright 2008 VMware, Inc.
4848b8605Smrg * All Rights Reserved.
5848b8605Smrg *
6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7848b8605Smrg * copy of this software and associated documentation files (the
8848b8605Smrg * "Software"), to deal in the Software without restriction, including
9848b8605Smrg * without limitation the rights to use, copy, modify, merge, publish,
10848b8605Smrg * distribute, sub license, and/or sell copies of the Software, and to
11848b8605Smrg * permit persons to whom the Software is furnished to do so, subject to
12848b8605Smrg * the following conditions:
13848b8605Smrg *
14848b8605Smrg * The above copyright notice and this permission notice (including the
15848b8605Smrg * next paragraph) shall be included in all copies or substantial portions
16848b8605Smrg * of the Software.
17848b8605Smrg *
18848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20848b8605Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21848b8605Smrg * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22848b8605Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23848b8605Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24848b8605Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25848b8605Smrg *
26848b8605Smrg **************************************************************************/
27848b8605Smrg
28848b8605Smrg#include "util/u_debug.h"
29848b8605Smrg#include "util/u_memory.h"
30848b8605Smrg#include "tgsi_info.h"
31848b8605Smrg
32848b8605Smrg#define NONE TGSI_OUTPUT_NONE
33848b8605Smrg#define COMP TGSI_OUTPUT_COMPONENTWISE
34848b8605Smrg#define REPL TGSI_OUTPUT_REPLICATE
35848b8605Smrg#define CHAN TGSI_OUTPUT_CHAN_DEPENDENT
36848b8605Smrg#define OTHR TGSI_OUTPUT_OTHER
37848b8605Smrg
38b8e80941Smrg#define OPCODE(_num_dst, _num_src, _output_mode, name, ...) \
39b8e80941Smrg   { .opcode = TGSI_OPCODE_ ## name, \
40b8e80941Smrg     .output_mode = _output_mode, .num_dst = _num_dst, .num_src = _num_src, \
41b8e80941Smrg     ##__VA_ARGS__ },
42848b8605Smrg
43b8e80941Smrg#define OPCODE_GAP(opc) { .opcode = opc },
44848b8605Smrg
45b8e80941Smrgstatic const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =
46b8e80941Smrg{
47b8e80941Smrg#include "tgsi_info_opcodes.h"
48848b8605Smrg};
49848b8605Smrg
50b8e80941Smrg#undef OPCODE
51b8e80941Smrg#undef OPCODE_GAP
52b8e80941Smrg
53848b8605Smrgconst struct tgsi_opcode_info *
54b8e80941Smrgtgsi_get_opcode_info(enum tgsi_opcode opcode)
55848b8605Smrg{
56848b8605Smrg   static boolean firsttime = 1;
57848b8605Smrg
58b8e80941Smrg   ASSERT_BITFIELD_SIZE(struct tgsi_opcode_info, opcode, TGSI_OPCODE_LAST - 1);
59b8e80941Smrg   ASSERT_BITFIELD_SIZE(struct tgsi_opcode_info, output_mode,
60b8e80941Smrg                        TGSI_OUTPUT_OTHER);
61b8e80941Smrg
62848b8605Smrg   if (firsttime) {
63848b8605Smrg      unsigned i;
64848b8605Smrg      firsttime = 0;
65b8e80941Smrg      for (i = 0; i < ARRAY_SIZE(opcode_info); i++)
66848b8605Smrg         assert(opcode_info[i].opcode == i);
67848b8605Smrg   }
68848b8605Smrg
69848b8605Smrg   if (opcode < TGSI_OPCODE_LAST)
70848b8605Smrg      return &opcode_info[opcode];
71848b8605Smrg
72848b8605Smrg   assert( 0 );
73848b8605Smrg   return NULL;
74848b8605Smrg}
75848b8605Smrg
76b8e80941Smrg#define OPCODE(_num_dst, _num_src, _output_mode, name, ...) #name,
77b8e80941Smrg#define OPCODE_GAP(opc) "UNK" #opc,
78b8e80941Smrg
79b8e80941Smrgstatic const char * const opcode_names[TGSI_OPCODE_LAST] =
80b8e80941Smrg{
81b8e80941Smrg#include "tgsi_info_opcodes.h"
82b8e80941Smrg};
83b8e80941Smrg
84b8e80941Smrg#undef OPCODE
85b8e80941Smrg#undef OPCODE_GAP
86848b8605Smrg
87848b8605Smrgconst char *
88b8e80941Smrgtgsi_get_opcode_name(enum tgsi_opcode opcode)
89848b8605Smrg{
90b8e80941Smrg   if (opcode >= ARRAY_SIZE(opcode_names))
91b8e80941Smrg      return "UNK_OOB";
92b8e80941Smrg   return opcode_names[opcode];
93848b8605Smrg}
94848b8605Smrg
95848b8605Smrg
96848b8605Smrgconst char *
97b8e80941Smrgtgsi_get_processor_name(enum pipe_shader_type processor)
98848b8605Smrg{
99848b8605Smrg   switch (processor) {
100b8e80941Smrg   case PIPE_SHADER_VERTEX:
101848b8605Smrg      return "vertex shader";
102b8e80941Smrg   case PIPE_SHADER_FRAGMENT:
103848b8605Smrg      return "fragment shader";
104b8e80941Smrg   case PIPE_SHADER_GEOMETRY:
105848b8605Smrg      return "geometry shader";
106b8e80941Smrg   case PIPE_SHADER_TESS_CTRL:
107b8e80941Smrg      return "tessellation control shader";
108b8e80941Smrg   case PIPE_SHADER_TESS_EVAL:
109b8e80941Smrg      return "tessellation evaluation shader";
110b8e80941Smrg   case PIPE_SHADER_COMPUTE:
111b8e80941Smrg      return "compute shader";
112848b8605Smrg   default:
113848b8605Smrg      return "unknown shader type!";
114848b8605Smrg   }
115848b8605Smrg}
116848b8605Smrg
117848b8605Smrg/**
118848b8605Smrg * Infer the type (of the dst) of the opcode.
119848b8605Smrg *
120848b8605Smrg * MOV and UCMP is special so return VOID
121848b8605Smrg */
122b8e80941Smrgstatic inline enum tgsi_opcode_type
123b8e80941Smrgtgsi_opcode_infer_type(enum tgsi_opcode opcode)
124848b8605Smrg{
125848b8605Smrg   switch (opcode) {
126848b8605Smrg   case TGSI_OPCODE_MOV:
127848b8605Smrg   case TGSI_OPCODE_UCMP:
128848b8605Smrg      return TGSI_TYPE_UNTYPED;
129848b8605Smrg   case TGSI_OPCODE_NOT:
130848b8605Smrg   case TGSI_OPCODE_SHL:
131848b8605Smrg   case TGSI_OPCODE_AND:
132848b8605Smrg   case TGSI_OPCODE_OR:
133848b8605Smrg   case TGSI_OPCODE_XOR:
134848b8605Smrg   case TGSI_OPCODE_TXQ:
135b8e80941Smrg   case TGSI_OPCODE_TXQS:
136848b8605Smrg   case TGSI_OPCODE_F2U:
137848b8605Smrg   case TGSI_OPCODE_UDIV:
138848b8605Smrg   case TGSI_OPCODE_UMAD:
139848b8605Smrg   case TGSI_OPCODE_UMAX:
140848b8605Smrg   case TGSI_OPCODE_UMIN:
141848b8605Smrg   case TGSI_OPCODE_UMOD:
142848b8605Smrg   case TGSI_OPCODE_UMUL:
143848b8605Smrg   case TGSI_OPCODE_USEQ:
144848b8605Smrg   case TGSI_OPCODE_USGE:
145848b8605Smrg   case TGSI_OPCODE_USHR:
146848b8605Smrg   case TGSI_OPCODE_USLT:
147848b8605Smrg   case TGSI_OPCODE_USNE:
148848b8605Smrg   case TGSI_OPCODE_SVIEWINFO:
149848b8605Smrg   case TGSI_OPCODE_UMUL_HI:
150b8e80941Smrg   case TGSI_OPCODE_UBFE:
151b8e80941Smrg   case TGSI_OPCODE_BFI:
152b8e80941Smrg   case TGSI_OPCODE_BREV:
153b8e80941Smrg   case TGSI_OPCODE_IMG2HND:
154b8e80941Smrg   case TGSI_OPCODE_SAMP2HND:
155848b8605Smrg      return TGSI_TYPE_UNSIGNED;
156848b8605Smrg   case TGSI_OPCODE_ARL:
157848b8605Smrg   case TGSI_OPCODE_ARR:
158848b8605Smrg   case TGSI_OPCODE_MOD:
159848b8605Smrg   case TGSI_OPCODE_F2I:
160848b8605Smrg   case TGSI_OPCODE_FSEQ:
161848b8605Smrg   case TGSI_OPCODE_FSGE:
162848b8605Smrg   case TGSI_OPCODE_FSLT:
163848b8605Smrg   case TGSI_OPCODE_FSNE:
164848b8605Smrg   case TGSI_OPCODE_IDIV:
165848b8605Smrg   case TGSI_OPCODE_IMAX:
166848b8605Smrg   case TGSI_OPCODE_IMIN:
167848b8605Smrg   case TGSI_OPCODE_INEG:
168848b8605Smrg   case TGSI_OPCODE_ISGE:
169848b8605Smrg   case TGSI_OPCODE_ISHR:
170848b8605Smrg   case TGSI_OPCODE_ISLT:
171848b8605Smrg   case TGSI_OPCODE_UADD:
172848b8605Smrg   case TGSI_OPCODE_UARL:
173848b8605Smrg   case TGSI_OPCODE_IABS:
174848b8605Smrg   case TGSI_OPCODE_ISSG:
175848b8605Smrg   case TGSI_OPCODE_IMUL_HI:
176b8e80941Smrg   case TGSI_OPCODE_IBFE:
177b8e80941Smrg   case TGSI_OPCODE_IMSB:
178b8e80941Smrg   case TGSI_OPCODE_DSEQ:
179b8e80941Smrg   case TGSI_OPCODE_DSGE:
180b8e80941Smrg   case TGSI_OPCODE_DSLT:
181b8e80941Smrg   case TGSI_OPCODE_DSNE:
182b8e80941Smrg   case TGSI_OPCODE_U64SEQ:
183b8e80941Smrg   case TGSI_OPCODE_U64SNE:
184b8e80941Smrg   case TGSI_OPCODE_U64SLT:
185b8e80941Smrg   case TGSI_OPCODE_U64SGE:
186b8e80941Smrg   case TGSI_OPCODE_I64SLT:
187b8e80941Smrg   case TGSI_OPCODE_I64SGE:
188b8e80941Smrg   case TGSI_OPCODE_LSB:
189b8e80941Smrg   case TGSI_OPCODE_POPC:
190b8e80941Smrg   case TGSI_OPCODE_UMSB:
191848b8605Smrg      return TGSI_TYPE_SIGNED;
192b8e80941Smrg   case TGSI_OPCODE_DADD:
193b8e80941Smrg   case TGSI_OPCODE_DABS:
194b8e80941Smrg   case TGSI_OPCODE_DFMA:
195b8e80941Smrg   case TGSI_OPCODE_DNEG:
196b8e80941Smrg   case TGSI_OPCODE_DMUL:
197b8e80941Smrg   case TGSI_OPCODE_DMAX:
198b8e80941Smrg   case TGSI_OPCODE_DDIV:
199b8e80941Smrg   case TGSI_OPCODE_DMIN:
200b8e80941Smrg   case TGSI_OPCODE_DRCP:
201b8e80941Smrg   case TGSI_OPCODE_DSQRT:
202b8e80941Smrg   case TGSI_OPCODE_DMAD:
203b8e80941Smrg   case TGSI_OPCODE_DLDEXP:
204b8e80941Smrg   case TGSI_OPCODE_DFRACEXP:
205b8e80941Smrg   case TGSI_OPCODE_DFRAC:
206b8e80941Smrg   case TGSI_OPCODE_DRSQ:
207b8e80941Smrg   case TGSI_OPCODE_DTRUNC:
208b8e80941Smrg   case TGSI_OPCODE_DCEIL:
209b8e80941Smrg   case TGSI_OPCODE_DFLR:
210b8e80941Smrg   case TGSI_OPCODE_DROUND:
211b8e80941Smrg   case TGSI_OPCODE_DSSG:
212b8e80941Smrg   case TGSI_OPCODE_F2D:
213b8e80941Smrg   case TGSI_OPCODE_I2D:
214b8e80941Smrg   case TGSI_OPCODE_U2D:
215b8e80941Smrg   case TGSI_OPCODE_U642D:
216b8e80941Smrg   case TGSI_OPCODE_I642D:
217b8e80941Smrg      return TGSI_TYPE_DOUBLE;
218b8e80941Smrg   case TGSI_OPCODE_U64MAX:
219b8e80941Smrg   case TGSI_OPCODE_U64MIN:
220b8e80941Smrg   case TGSI_OPCODE_U64ADD:
221b8e80941Smrg   case TGSI_OPCODE_U64MUL:
222b8e80941Smrg   case TGSI_OPCODE_U64DIV:
223b8e80941Smrg   case TGSI_OPCODE_U64MOD:
224b8e80941Smrg   case TGSI_OPCODE_U64SHL:
225b8e80941Smrg   case TGSI_OPCODE_U64SHR:
226b8e80941Smrg   case TGSI_OPCODE_F2U64:
227b8e80941Smrg   case TGSI_OPCODE_D2U64:
228b8e80941Smrg      return TGSI_TYPE_UNSIGNED64;
229b8e80941Smrg   case TGSI_OPCODE_I64MAX:
230b8e80941Smrg   case TGSI_OPCODE_I64MIN:
231b8e80941Smrg   case TGSI_OPCODE_I64ABS:
232b8e80941Smrg   case TGSI_OPCODE_I64SSG:
233b8e80941Smrg   case TGSI_OPCODE_I64NEG:
234b8e80941Smrg   case TGSI_OPCODE_I64SHR:
235b8e80941Smrg   case TGSI_OPCODE_I64DIV:
236b8e80941Smrg   case TGSI_OPCODE_I64MOD:
237b8e80941Smrg   case TGSI_OPCODE_F2I64:
238b8e80941Smrg   case TGSI_OPCODE_U2I64:
239b8e80941Smrg   case TGSI_OPCODE_I2I64:
240b8e80941Smrg   case TGSI_OPCODE_D2I64:
241b8e80941Smrg      return TGSI_TYPE_SIGNED64;
242848b8605Smrg   default:
243848b8605Smrg      return TGSI_TYPE_FLOAT;
244848b8605Smrg   }
245848b8605Smrg}
246848b8605Smrg
247848b8605Smrg/*
248848b8605Smrg * infer the source type of a TGSI opcode.
249848b8605Smrg */
250848b8605Smrgenum tgsi_opcode_type
251b8e80941Smrgtgsi_opcode_infer_src_type(enum tgsi_opcode opcode, uint src_idx)
252848b8605Smrg{
253b8e80941Smrg   if (src_idx == 1 &&
254b8e80941Smrg       (opcode == TGSI_OPCODE_DLDEXP || opcode == TGSI_OPCODE_LDEXP))
255b8e80941Smrg      return TGSI_TYPE_SIGNED;
256b8e80941Smrg
257848b8605Smrg   switch (opcode) {
258848b8605Smrg   case TGSI_OPCODE_UIF:
259848b8605Smrg   case TGSI_OPCODE_TXF:
260b8e80941Smrg   case TGSI_OPCODE_TXF_LZ:
261848b8605Smrg   case TGSI_OPCODE_U2F:
262b8e80941Smrg   case TGSI_OPCODE_U2D:
263848b8605Smrg   case TGSI_OPCODE_UADD:
264848b8605Smrg   case TGSI_OPCODE_SWITCH:
265848b8605Smrg   case TGSI_OPCODE_CASE:
266848b8605Smrg   case TGSI_OPCODE_SAMPLE_I:
267848b8605Smrg   case TGSI_OPCODE_SAMPLE_I_MS:
268848b8605Smrg   case TGSI_OPCODE_UMUL_HI:
269b8e80941Smrg   case TGSI_OPCODE_UP2H:
270b8e80941Smrg   case TGSI_OPCODE_U2I64:
271b8e80941Smrg   case TGSI_OPCODE_MEMBAR:
272b8e80941Smrg   case TGSI_OPCODE_UMSB:
273848b8605Smrg      return TGSI_TYPE_UNSIGNED;
274848b8605Smrg   case TGSI_OPCODE_IMUL_HI:
275848b8605Smrg   case TGSI_OPCODE_I2F:
276b8e80941Smrg   case TGSI_OPCODE_I2D:
277b8e80941Smrg   case TGSI_OPCODE_I2I64:
278848b8605Smrg      return TGSI_TYPE_SIGNED;
279848b8605Smrg   case TGSI_OPCODE_ARL:
280848b8605Smrg   case TGSI_OPCODE_ARR:
281b8e80941Smrg   case TGSI_OPCODE_F2D:
282848b8605Smrg   case TGSI_OPCODE_F2I:
283848b8605Smrg   case TGSI_OPCODE_F2U:
284848b8605Smrg   case TGSI_OPCODE_FSEQ:
285848b8605Smrg   case TGSI_OPCODE_FSGE:
286848b8605Smrg   case TGSI_OPCODE_FSLT:
287848b8605Smrg   case TGSI_OPCODE_FSNE:
288848b8605Smrg   case TGSI_OPCODE_UCMP:
289b8e80941Smrg   case TGSI_OPCODE_F2U64:
290b8e80941Smrg   case TGSI_OPCODE_F2I64:
291848b8605Smrg      return TGSI_TYPE_FLOAT;
292b8e80941Smrg   case TGSI_OPCODE_D2F:
293b8e80941Smrg   case TGSI_OPCODE_D2U:
294b8e80941Smrg   case TGSI_OPCODE_D2I:
295b8e80941Smrg   case TGSI_OPCODE_DSEQ:
296b8e80941Smrg   case TGSI_OPCODE_DSGE:
297b8e80941Smrg   case TGSI_OPCODE_DSLT:
298b8e80941Smrg   case TGSI_OPCODE_DSNE:
299b8e80941Smrg   case TGSI_OPCODE_D2U64:
300b8e80941Smrg   case TGSI_OPCODE_D2I64:
301b8e80941Smrg      return TGSI_TYPE_DOUBLE;
302b8e80941Smrg   case TGSI_OPCODE_U64SEQ:
303b8e80941Smrg   case TGSI_OPCODE_U64SNE:
304b8e80941Smrg   case TGSI_OPCODE_U64SLT:
305b8e80941Smrg   case TGSI_OPCODE_U64SGE:
306b8e80941Smrg   case TGSI_OPCODE_U642F:
307b8e80941Smrg   case TGSI_OPCODE_U642D:
308b8e80941Smrg      return TGSI_TYPE_UNSIGNED64;
309b8e80941Smrg   case TGSI_OPCODE_I64SLT:
310b8e80941Smrg   case TGSI_OPCODE_I64SGE:
311b8e80941Smrg   case TGSI_OPCODE_I642F:
312b8e80941Smrg   case TGSI_OPCODE_I642D:
313b8e80941Smrg            return TGSI_TYPE_SIGNED64;
314848b8605Smrg   default:
315848b8605Smrg      return tgsi_opcode_infer_type(opcode);
316848b8605Smrg   }
317848b8605Smrg}
318848b8605Smrg
319848b8605Smrg/*
320848b8605Smrg * infer the destination type of a TGSI opcode.
321848b8605Smrg */
322848b8605Smrgenum tgsi_opcode_type
323b8e80941Smrgtgsi_opcode_infer_dst_type(enum tgsi_opcode opcode, uint dst_idx)
324848b8605Smrg{
325b8e80941Smrg   if (dst_idx == 1 && opcode == TGSI_OPCODE_DFRACEXP)
326b8e80941Smrg      return TGSI_TYPE_SIGNED;
327b8e80941Smrg
328848b8605Smrg   return tgsi_opcode_infer_type(opcode);
329848b8605Smrg}
330