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