1 /* 2 * Copyright 2012 Vadim Girlin <vadimgirlin (at) gmail.com> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * on the rights to use, copy, modify, merge, publish, distribute, sub 8 * license, and/or sell copies of the Software, and to permit persons to whom 9 * the Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. 22 * 23 * Authors: 24 * Vadim Girlin 25 */ 26 27 #ifndef R600_ISA_H_ 28 #define R600_ISA_H_ 29 30 #include "util/u_debug.h" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* ALU flags */ 37 enum alu_op_flags 38 { 39 AF_V = (1<<0), /* allowed in vector slots */ 40 41 /* allowed in scalar(trans) slot (slots xyz on cayman, may be replicated 42 * to w) */ 43 AF_S = (1<<1), 44 45 AF_4SLOT = (1<<2), /* uses four vector slots (e.g. DOT4) */ 46 AF_4V = (AF_V | AF_4SLOT), 47 AF_VS = (AF_V | AF_S), /* allowed in any slot */ 48 49 AF_KILL = (1<<4), 50 AF_PRED = (1<<5), 51 AF_SET = (1<<6), 52 53 /* e.g. MUL_PREV instructions, allowed in x/y, depends on z/w */ 54 AF_PREV_INTERLEAVE = (1<<7), 55 56 AF_MOVA = (1<<8), /* all MOVA instructions */ 57 AF_IEEE = (1<<10), 58 59 AF_DST_TYPE_MASK = (3<<11), 60 AF_FLOAT_DST = 0, 61 AF_INT_DST = (1<<11), 62 AF_UINT_DST = (3<<11), 63 64 /* DP instructions, 2-slot pairs */ 65 AF_64 = (1<<13), 66 /* 24 bit instructions */ 67 AF_24 = (1<<14), 68 /* DX10 variants */ 69 AF_DX10 = (1<<15), 70 71 /* result is replicated to all channels (only if AF_4V is also set - 72 * for special handling of MULLO_INT on CM) */ 73 AF_REPL = (1<<16), 74 75 /* interpolation instructions */ 76 AF_INTERP = (1<<17), 77 78 /* LDS instructions */ 79 AF_LDS = (1<<20), 80 81 /* e.g. DOT - depends on the next slot in the same group (x<=y/y<=z/z<=w) */ 82 AF_PREV_NEXT = (1<<21), 83 84 /* int<->flt conversions */ 85 AF_CVT = (1<<22), 86 87 /* commutative operation on src0 and src1 ( a op b = b op a), 88 * includes MULADDs (considering the MUL part on src0 and src1 only) */ 89 AF_M_COMM = (1 << 23), 90 91 /* associative operation ((a op b) op c) == (a op (b op c)), 92 * includes MULADDs (considering the MUL part on src0 and src1 only) */ 93 AF_M_ASSOC = (1 << 24), 94 95 AF_PRED_PUSH = (1 << 25), 96 97 AF_ANY_PRED = (AF_PRED | AF_PRED_PUSH), 98 99 AF_CMOV = (1 << 26), 100 101 // for SETcc, PREDSETcc, ... - type of comparison 102 AF_CMP_TYPE_MASK = (3 << 27), 103 AF_FLOAT_CMP = 0, 104 AF_INT_CMP = (1 << 27), 105 AF_UINT_CMP = (3 << 27), 106 107 /* condition codes - 3 bits */ 108 AF_CC_SHIFT = 29, 109 AF_CC_MASK = (7U << AF_CC_SHIFT), 110 AF_CC_E = (0U << AF_CC_SHIFT), 111 AF_CC_GT = (1U << AF_CC_SHIFT), 112 AF_CC_GE = (2U << AF_CC_SHIFT), 113 AF_CC_NE = (3U << AF_CC_SHIFT), 114 AF_CC_LT = (4U << AF_CC_SHIFT), 115 AF_CC_LE = (5U << AF_CC_SHIFT), 116 }; 117 118 /* flags for FETCH instructions (TEX/VTX/GDS) */ 119 enum fetch_op_flags 120 { 121 FF_GDS = (1<<0), 122 FF_TEX = (1<<1), 123 124 FF_SETGRAD = (1<<2), 125 FF_GETGRAD = (1<<3), 126 FF_USEGRAD = (1<<4), 127 128 FF_VTX = (1<<5), 129 FF_MEM = (1<<6), 130 131 FF_SET_TEXTURE_OFFSETS = (1<<7), 132 FF_USE_TEXTURE_OFFSETS = (1<<8), 133 }; 134 135 /* flags for CF instructions */ 136 enum cf_op_flags 137 { 138 CF_CLAUSE = (1<<0), /* execute clause (alu/fetch ...) */ 139 CF_ACK = (1<<1), /* acked versions of some instructions */ 140 CF_ALU = (1<<2), /* alu clause execution */ 141 CF_ALU_EXT = (1<<3), /* ALU_EXTENDED */ 142 CF_EXP = (1<<4), /* export (CF_ALLOC_EXPORT_WORD1_SWIZ) */ 143 CF_BRANCH = (1<<5), /* branch instructions */ 144 CF_LOOP = (1<<6), /* loop instructions */ 145 CF_CALL = (1<<7), /* call instructions */ 146 CF_MEM = (1<<8), /* export_mem (CF_ALLOC_EXPORT_WORD1_BUF) */ 147 CF_FETCH = (1<<9), /* fetch clause */ 148 149 CF_UNCOND = (1<<10), /* COND = ACTIVE required */ 150 CF_EMIT = (1<<11), 151 CF_STRM = (1<<12), /* MEM_STREAM* */ 152 153 CF_RAT = (1<<13), /* MEM_RAT* */ 154 155 CF_LOOP_START = (1<<14) 156 }; 157 158 /* ALU instruction info */ 159 struct alu_op_info 160 { 161 /* instruction name */ 162 const char *name; 163 /* number of source operands */ 164 int src_count; 165 /* opcodes, [0] - for r6xx/r7xx, [1] - for evergreen/cayman 166 * (-1) if instruction doesn't exist (more precise info in "slots") */ 167 int opcode[2]; 168 /* slots for r6xx, r7xx, evergreen, cayman 169 * (0 if instruction doesn't exist for chip class) */ 170 int slots[4]; 171 /* flags (mostly autogenerated from instruction name) */ 172 unsigned int flags; 173 }; 174 175 /* FETCH instruction info */ 176 struct fetch_op_info 177 { 178 const char * name; 179 /* for every chip class */ 180 int opcode[4]; 181 int flags; 182 }; 183 184 /* CF instruction info */ 185 struct cf_op_info 186 { 187 const char * name; 188 /* for every chip class */ 189 int opcode[4]; 190 int flags; 191 }; 192 193 194 #define ALU_OP2_ADD 0 195 #define ALU_OP2_MUL 1 196 #define ALU_OP2_MUL_IEEE 2 197 #define ALU_OP2_MAX 3 198 #define ALU_OP2_MIN 4 199 #define ALU_OP2_MAX_DX10 5 200 #define ALU_OP2_MIN_DX10 6 201 #define ALU_OP2_SETE 7 202 #define ALU_OP2_SETGT 8 203 #define ALU_OP2_SETGE 9 204 #define ALU_OP2_SETNE 10 205 #define ALU_OP2_SETE_DX10 11 206 #define ALU_OP2_SETGT_DX10 12 207 #define ALU_OP2_SETGE_DX10 13 208 #define ALU_OP2_SETNE_DX10 14 209 #define ALU_OP1_FRACT 15 210 #define ALU_OP1_TRUNC 16 211 #define ALU_OP1_CEIL 17 212 #define ALU_OP1_RNDNE 18 213 #define ALU_OP1_FLOOR 19 214 #define ALU_OP2_ASHR_INT 20 215 #define ALU_OP2_LSHR_INT 21 216 #define ALU_OP2_LSHL_INT 22 217 #define ALU_OP1_MOV 23 218 #define ALU_OP0_NOP 24 219 #define ALU_OP2_PRED_SETGT_UINT 25 220 #define ALU_OP2_PRED_SETGE_UINT 26 221 #define ALU_OP2_PRED_SETE 27 222 #define ALU_OP2_PRED_SETGT 28 223 #define ALU_OP2_PRED_SETGE 29 224 #define ALU_OP2_PRED_SETNE 30 225 #define ALU_OP1_PRED_SET_INV 31 226 #define ALU_OP2_PRED_SET_POP 32 227 #define ALU_OP0_PRED_SET_CLR 33 228 #define ALU_OP1_PRED_SET_RESTORE 34 229 #define ALU_OP2_PRED_SETE_PUSH 35 230 #define ALU_OP2_PRED_SETGT_PUSH 36 231 #define ALU_OP2_PRED_SETGE_PUSH 37 232 #define ALU_OP2_PRED_SETNE_PUSH 38 233 #define ALU_OP2_KILLE 39 234 #define ALU_OP2_KILLGT 40 235 #define ALU_OP2_KILLGE 41 236 #define ALU_OP2_KILLNE 42 237 #define ALU_OP2_AND_INT 43 238 #define ALU_OP2_OR_INT 44 239 #define ALU_OP2_XOR_INT 45 240 #define ALU_OP1_NOT_INT 46 241 #define ALU_OP2_ADD_INT 47 242 #define ALU_OP2_SUB_INT 48 243 #define ALU_OP2_MAX_INT 49 244 #define ALU_OP2_MIN_INT 50 245 #define ALU_OP2_MAX_UINT 51 246 #define ALU_OP2_MIN_UINT 52 247 #define ALU_OP2_SETE_INT 53 248 #define ALU_OP2_SETGT_INT 54 249 #define ALU_OP2_SETGE_INT 55 250 #define ALU_OP2_SETNE_INT 56 251 #define ALU_OP2_SETGT_UINT 57 252 #define ALU_OP2_SETGE_UINT 58 253 #define ALU_OP2_KILLGT_UINT 59 254 #define ALU_OP2_KILLGE_UINT 60 255 #define ALU_OP2_PRED_SETE_INT 61 256 #define ALU_OP2_PRED_SETGT_INT 62 257 #define ALU_OP2_PRED_SETGE_INT 63 258 #define ALU_OP2_PRED_SETNE_INT 64 259 #define ALU_OP2_KILLE_INT 65 260 #define ALU_OP2_KILLGT_INT 66 261 #define ALU_OP2_KILLGE_INT 67 262 #define ALU_OP2_KILLNE_INT 68 263 #define ALU_OP2_PRED_SETE_PUSH_INT 69 264 #define ALU_OP2_PRED_SETGT_PUSH_INT 70 265 #define ALU_OP2_PRED_SETGE_PUSH_INT 71 266 #define ALU_OP2_PRED_SETNE_PUSH_INT 72 267 #define ALU_OP2_PRED_SETLT_PUSH_INT 73 268 #define ALU_OP2_PRED_SETLE_PUSH_INT 74 269 #define ALU_OP1_FLT_TO_INT 75 270 #define ALU_OP1_BFREV_INT 76 271 #define ALU_OP2_ADDC_UINT 77 272 #define ALU_OP2_SUBB_UINT 78 273 #define ALU_OP0_GROUP_BARRIER 79 274 #define ALU_OP0_GROUP_SEQ_BEGIN 80 275 #define ALU_OP0_GROUP_SEQ_END 81 276 #define ALU_OP2_SET_MODE 82 277 #define ALU_OP0_SET_CF_IDX0 83 278 #define ALU_OP0_SET_CF_IDX1 84 279 #define ALU_OP2_SET_LDS_SIZE 85 280 #define ALU_OP2_MUL_INT24 86 281 #define ALU_OP2_MULHI_INT24 87 282 #define ALU_OP1_FLT_TO_INT_TRUNC 88 283 #define ALU_OP1_EXP_IEEE 89 284 #define ALU_OP1_LOG_CLAMPED 90 285 #define ALU_OP1_LOG_IEEE 91 286 #define ALU_OP1_RECIP_CLAMPED 92 287 #define ALU_OP1_RECIP_FF 93 288 #define ALU_OP1_RECIP_IEEE 94 289 #define ALU_OP1_RECIPSQRT_CLAMPED 95 290 #define ALU_OP1_RECIPSQRT_FF 96 291 #define ALU_OP1_RECIPSQRT_IEEE 97 292 #define ALU_OP1_SQRT_IEEE 98 293 #define ALU_OP1_SIN 99 294 #define ALU_OP1_COS 100 295 #define ALU_OP2_MULLO_INT 101 296 #define ALU_OP2_MULHI_INT 102 297 #define ALU_OP2_MULLO_UINT 103 298 #define ALU_OP2_MULHI_UINT 104 299 #define ALU_OP1_RECIP_INT 105 300 #define ALU_OP1_RECIP_UINT 106 301 #define ALU_OP2_RECIP_64 107 302 #define ALU_OP2_RECIP_CLAMPED_64 108 303 #define ALU_OP2_RECIPSQRT_64 109 304 #define ALU_OP2_RECIPSQRT_CLAMPED_64 110 305 #define ALU_OP2_SQRT_64 111 306 #define ALU_OP1_FLT_TO_UINT 112 307 #define ALU_OP1_INT_TO_FLT 113 308 #define ALU_OP1_UINT_TO_FLT 114 309 #define ALU_OP2_BFM_INT 115 310 #define ALU_OP1_FLT32_TO_FLT16 116 311 #define ALU_OP1_FLT16_TO_FLT32 117 312 #define ALU_OP1_UBYTE0_FLT 118 313 #define ALU_OP1_UBYTE1_FLT 119 314 #define ALU_OP1_UBYTE2_FLT 120 315 #define ALU_OP1_UBYTE3_FLT 121 316 #define ALU_OP1_BCNT_INT 122 317 #define ALU_OP1_FFBH_UINT 123 318 #define ALU_OP1_FFBL_INT 124 319 #define ALU_OP1_FFBH_INT 125 320 #define ALU_OP1_FLT_TO_UINT4 126 321 #define ALU_OP2_DOT_IEEE 127 322 #define ALU_OP1_FLT_TO_INT_RPI 128 323 #define ALU_OP1_FLT_TO_INT_FLOOR 129 324 #define ALU_OP2_MULHI_UINT24 130 325 #define ALU_OP1_MBCNT_32HI_INT 131 326 #define ALU_OP1_OFFSET_TO_FLT 132 327 #define ALU_OP2_MUL_UINT24 133 328 #define ALU_OP1_BCNT_ACCUM_PREV_INT 134 329 #define ALU_OP1_MBCNT_32LO_ACCUM_PREV_INT 135 330 #define ALU_OP2_SETE_64 136 331 #define ALU_OP2_SETNE_64 137 332 #define ALU_OP2_SETGT_64 138 333 #define ALU_OP2_SETGE_64 139 334 #define ALU_OP2_MIN_64 140 335 #define ALU_OP2_MAX_64 141 336 #define ALU_OP2_DOT4 142 337 #define ALU_OP2_DOT4_IEEE 143 338 #define ALU_OP2_CUBE 144 339 #define ALU_OP1_MAX4 145 340 #define ALU_OP1_FREXP_64 146 341 #define ALU_OP2_LDEXP_64 147 342 #define ALU_OP1_FRACT_64 148 343 #define ALU_OP2_PRED_SETGT_64 149 344 #define ALU_OP2_PRED_SETE_64 150 345 #define ALU_OP2_PRED_SETGE_64 151 346 #define ALU_OP2_MUL_64 152 347 #define ALU_OP2_ADD_64 153 348 #define ALU_OP1_MOVA_INT 154 349 #define ALU_OP1_FLT64_TO_FLT32 155 350 #define ALU_OP1_FLT32_TO_FLT64 156 351 #define ALU_OP2_SAD_ACCUM_PREV_UINT 157 352 #define ALU_OP2_DOT 158 353 #define ALU_OP1_MUL_PREV 159 354 #define ALU_OP1_MUL_IEEE_PREV 160 355 #define ALU_OP1_ADD_PREV 161 356 #define ALU_OP2_MULADD_PREV 162 357 #define ALU_OP2_MULADD_IEEE_PREV 163 358 #define ALU_OP2_INTERP_XY 164 359 #define ALU_OP2_INTERP_ZW 165 360 #define ALU_OP2_INTERP_X 166 361 #define ALU_OP2_INTERP_Z 167 362 #define ALU_OP1_STORE_FLAGS 168 363 #define ALU_OP1_LOAD_STORE_FLAGS 169 364 #define ALU_OP2_LDS_1A 170 365 #define ALU_OP2_LDS_1A1D 171 366 #define ALU_OP2_LDS_2A 172 367 #define ALU_OP1_INTERP_LOAD_P0 173 368 #define ALU_OP1_INTERP_LOAD_P10 174 369 #define ALU_OP1_INTERP_LOAD_P20 175 370 #define ALU_OP3_BFE_UINT 176 371 #define ALU_OP3_BFE_INT 177 372 #define ALU_OP3_BFI_INT 178 373 #define ALU_OP3_FMA 179 374 #define ALU_OP3_MULADD_INT24 180 375 #define ALU_OP3_CNDNE_64 181 376 #define ALU_OP3_FMA_64 182 377 #define ALU_OP3_LERP_UINT 183 378 #define ALU_OP3_BIT_ALIGN_INT 184 379 #define ALU_OP3_BYTE_ALIGN_INT 185 380 #define ALU_OP3_SAD_ACCUM_UINT 186 381 #define ALU_OP3_SAD_ACCUM_HI_UINT 187 382 #define ALU_OP3_MULADD_UINT24 188 383 #define ALU_OP3_LDS_IDX_OP 189 384 #define ALU_OP3_MULADD 190 385 #define ALU_OP3_MULADD_M2 191 386 #define ALU_OP3_MULADD_M4 192 387 #define ALU_OP3_MULADD_D2 193 388 #define ALU_OP3_MULADD_IEEE 194 389 #define ALU_OP3_CNDE 195 390 #define ALU_OP3_CNDGT 196 391 #define ALU_OP3_CNDGE 197 392 #define ALU_OP3_CNDE_INT 198 393 #define ALU_OP3_CNDGT_INT 199 394 #define ALU_OP3_CNDGE_INT 200 395 #define ALU_OP3_MUL_LIT 201 396 #define ALU_OP1_MOVA 202 397 #define ALU_OP1_MOVA_FLOOR 203 398 #define ALU_OP1_MOVA_GPR_INT 204 399 #define ALU_OP3_MULADD_64 205 400 #define ALU_OP3_MULADD_64_M2 206 401 #define ALU_OP3_MULADD_64_M4 207 402 #define ALU_OP3_MULADD_64_D2 208 403 #define ALU_OP3_MUL_LIT_M2 209 404 #define ALU_OP3_MUL_LIT_M4 210 405 #define ALU_OP3_MUL_LIT_D2 211 406 #define ALU_OP3_MULADD_IEEE_M2 212 407 #define ALU_OP3_MULADD_IEEE_M4 213 408 #define ALU_OP3_MULADD_IEEE_D2 214 409 410 #define LDS_OP2_LDS_ADD 215 411 #define LDS_OP2_LDS_SUB 216 412 #define LDS_OP2_LDS_RSUB 217 413 #define LDS_OP2_LDS_INC 218 414 #define LDS_OP2_LDS_DEC 219 415 #define LDS_OP2_LDS_MIN_INT 220 416 #define LDS_OP2_LDS_MAX_INT 221 417 #define LDS_OP2_LDS_MIN_UINT 222 418 #define LDS_OP2_LDS_MAX_UINT 223 419 #define LDS_OP2_LDS_AND 224 420 #define LDS_OP2_LDS_OR 225 421 #define LDS_OP2_LDS_XOR 226 422 #define LDS_OP3_LDS_MSKOR 227 423 #define LDS_OP2_LDS_WRITE 228 424 #define LDS_OP3_LDS_WRITE_REL 229 425 #define LDS_OP3_LDS_WRITE2 230 426 #define LDS_OP3_LDS_CMP_STORE 231 427 #define LDS_OP3_LDS_CMP_STORE_SPF 232 428 #define LDS_OP2_LDS_BYTE_WRITE 233 429 #define LDS_OP2_LDS_SHORT_WRITE 234 430 #define LDS_OP2_LDS_ADD_RET 235 431 #define LDS_OP2_LDS_SUB_RET 236 432 #define LDS_OP2_LDS_RSUB_RET 237 433 #define LDS_OP2_LDS_INC_RET 238 434 #define LDS_OP2_LDS_DEC_RET 239 435 #define LDS_OP2_LDS_MIN_INT_RET 240 436 #define LDS_OP2_LDS_MAX_INT_RET 241 437 #define LDS_OP2_LDS_MIN_UINT_RET 242 438 #define LDS_OP2_LDS_MAX_UINT_RET 243 439 #define LDS_OP2_LDS_AND_RET 244 440 #define LDS_OP2_LDS_OR_RET 245 441 #define LDS_OP2_LDS_XOR_RET 246 442 #define LDS_OP3_LDS_MSKOR_RET 247 443 #define LDS_OP2_LDS_XCHG_RET 248 444 #define LDS_OP3_LDS_XCHG_REL_RET 249 445 #define LDS_OP3_LDS_XCHG2_RET 250 446 #define LDS_OP3_LDS_CMP_XCHG_RET 251 447 #define LDS_OP3_LDS_CMP_XCHG_SPF_RET 252 448 #define LDS_OP1_LDS_READ_RET 253 449 #define LDS_OP1_LDS_READ_REL_RET 254 450 #define LDS_OP2_LDS_READ2_RET 255 451 #define LDS_OP3_LDS_READWRITE_RET 256 452 #define LDS_OP1_LDS_BYTE_READ_RET 257 453 #define LDS_OP1_LDS_UBYTE_READ_RET 258 454 #define LDS_OP1_LDS_SHORT_READ_RET 259 455 #define LDS_OP1_LDS_USHORT_READ_RET 260 456 457 #define FETCH_OP_VFETCH 0 458 #define FETCH_OP_SEMFETCH 1 459 #define FETCH_OP_READ_SCRATCH 2 460 #define FETCH_OP_READ_REDUCT 3 461 #define FETCH_OP_READ_MEM 4 462 #define FETCH_OP_DS_LOCAL_WRITE 5 463 #define FETCH_OP_DS_LOCAL_READ 6 464 #define FETCH_OP_GDS_ADD 7 465 #define FETCH_OP_GDS_SUB 8 466 #define FETCH_OP_GDS_RSUB 9 467 #define FETCH_OP_GDS_INC 10 468 #define FETCH_OP_GDS_DEC 11 469 #define FETCH_OP_GDS_MIN_INT 12 470 #define FETCH_OP_GDS_MAX_INT 13 471 #define FETCH_OP_GDS_MIN_UINT 14 472 #define FETCH_OP_GDS_MAX_UINT 15 473 #define FETCH_OP_GDS_AND 16 474 #define FETCH_OP_GDS_OR 17 475 #define FETCH_OP_GDS_XOR 18 476 #define FETCH_OP_GDS_MSKOR 19 477 #define FETCH_OP_GDS_WRITE 20 478 #define FETCH_OP_GDS_WRITE_REL 21 479 #define FETCH_OP_GDS_WRITE2 22 480 #define FETCH_OP_GDS_CMP_STORE 23 481 #define FETCH_OP_GDS_CMP_STORE_SPF 24 482 #define FETCH_OP_GDS_BYTE_WRITE 25 483 #define FETCH_OP_GDS_SHORT_WRITE 26 484 #define FETCH_OP_GDS_ADD_RET 27 485 #define FETCH_OP_GDS_SUB_RET 28 486 #define FETCH_OP_GDS_RSUB_RET 29 487 #define FETCH_OP_GDS_INC_RET 30 488 #define FETCH_OP_GDS_DEC_RET 31 489 #define FETCH_OP_GDS_MIN_INT_RET 32 490 #define FETCH_OP_GDS_MAX_INT_RET 33 491 #define FETCH_OP_GDS_MIN_UINT_RET 34 492 #define FETCH_OP_GDS_MAX_UINT_RET 35 493 #define FETCH_OP_GDS_AND_RET 36 494 #define FETCH_OP_GDS_OR_RET 37 495 #define FETCH_OP_GDS_XOR_RET 38 496 #define FETCH_OP_GDS_MSKOR_RET 39 497 #define FETCH_OP_GDS_XCHG_RET 40 498 #define FETCH_OP_GDS_XCHG_REL_RET 41 499 #define FETCH_OP_GDS_XCHG2_RET 42 500 #define FETCH_OP_GDS_CMP_XCHG_RET 43 501 #define FETCH_OP_GDS_CMP_XCHG_SPF_RET 44 502 #define FETCH_OP_GDS_READ_RET 45 503 #define FETCH_OP_GDS_READ_REL_RET 46 504 #define FETCH_OP_GDS_READ2_RET 47 505 #define FETCH_OP_GDS_READWRITE_RET 48 506 #define FETCH_OP_GDS_BYTE_READ_RET 49 507 #define FETCH_OP_GDS_UBYTE_READ_RET 50 508 #define FETCH_OP_GDS_SHORT_READ_RET 51 509 #define FETCH_OP_GDS_USHORT_READ_RET 52 510 #define FETCH_OP_GDS_ATOMIC_ORDERED_ALLOC 53 511 #define FETCH_OP_TF_WRITE 54 512 #define FETCH_OP_DS_GLOBAL_WRITE 55 513 #define FETCH_OP_DS_GLOBAL_READ 56 514 #define FETCH_OP_LD 57 515 #define FETCH_OP_LDFPTR 58 516 #define FETCH_OP_GET_TEXTURE_RESINFO 59 517 #define FETCH_OP_GET_NUMBER_OF_SAMPLES 60 518 #define FETCH_OP_GET_LOD 61 519 #define FETCH_OP_GET_GRADIENTS_H 62 520 #define FETCH_OP_GET_GRADIENTS_V 63 521 #define FETCH_OP_GET_GRADIENTS_H_FINE 64 522 #define FETCH_OP_GET_GRADIENTS_V_FINE 65 523 #define FETCH_OP_GET_LERP 66 524 #define FETCH_OP_SET_TEXTURE_OFFSETS 67 525 #define FETCH_OP_KEEP_GRADIENTS 68 526 #define FETCH_OP_SET_GRADIENTS_H 69 527 #define FETCH_OP_SET_GRADIENTS_V 70 528 #define FETCH_OP_SET_GRADIENTS_H_COARSE 71 529 #define FETCH_OP_SET_GRADIENTS_V_COARSE 72 530 #define FETCH_OP_SET_GRADIENTS_H_PACKED_FINE 73 531 #define FETCH_OP_SET_GRADIENTS_V_PACKED_FINE 74 532 #define FETCH_OP_SET_GRADIENTS_H_PACKED_COARSE 75 533 #define FETCH_OP_SET_GRADIENTS_V_PACKED_COARSE 76 534 #define FETCH_OP_PASS 77 535 #define FETCH_OP_PASS1 78 536 #define FETCH_OP_PASS2 79 537 #define FETCH_OP_PASS3 80 538 #define FETCH_OP_SET_CUBEMAP_INDEX 81 539 #define FETCH_OP_GET_BUFFER_RESINFO 82 540 #define FETCH_OP_FETCH4 83 541 #define FETCH_OP_SAMPLE 84 542 #define FETCH_OP_SAMPLE_L 85 543 #define FETCH_OP_SAMPLE_LB 86 544 #define FETCH_OP_SAMPLE_LZ 87 545 #define FETCH_OP_SAMPLE_G 88 546 #define FETCH_OP_SAMPLE_G_L 89 547 #define FETCH_OP_GATHER4 90 548 #define FETCH_OP_SAMPLE_G_LB 91 549 #define FETCH_OP_SAMPLE_G_LZ 92 550 #define FETCH_OP_GATHER4_O 93 551 #define FETCH_OP_SAMPLE_C 94 552 #define FETCH_OP_SAMPLE_C_L 95 553 #define FETCH_OP_SAMPLE_C_LB 96 554 #define FETCH_OP_SAMPLE_C_LZ 97 555 #define FETCH_OP_SAMPLE_C_G 98 556 #define FETCH_OP_SAMPLE_C_G_L 99 557 #define FETCH_OP_GATHER4_C 100 558 #define FETCH_OP_SAMPLE_C_G_LB 101 559 #define FETCH_OP_SAMPLE_C_G_LZ 102 560 #define FETCH_OP_GATHER4_C_O 103 561 562 #define CF_OP_NOP 0 563 #define CF_OP_TEX 1 564 #define CF_OP_VTX 2 565 #define CF_OP_VTX_TC 3 566 #define CF_OP_GDS 4 567 #define CF_OP_LOOP_START 5 568 #define CF_OP_LOOP_END 6 569 #define CF_OP_LOOP_START_DX10 7 570 #define CF_OP_LOOP_START_NO_AL 8 571 #define CF_OP_LOOP_CONTINUE 9 572 #define CF_OP_LOOP_BREAK 10 573 #define CF_OP_JUMP 11 574 #define CF_OP_PUSH 12 575 #define CF_OP_PUSH_ELSE 13 576 #define CF_OP_ELSE 14 577 #define CF_OP_POP 15 578 #define CF_OP_POP_JUMP 16 579 #define CF_OP_POP_PUSH 17 580 #define CF_OP_POP_PUSH_ELSE 18 581 #define CF_OP_CALL 19 582 #define CF_OP_CALL_FS 20 583 #define CF_OP_RET 21 584 #define CF_OP_EMIT_VERTEX 22 585 #define CF_OP_EMIT_CUT_VERTEX 23 586 #define CF_OP_CUT_VERTEX 24 587 #define CF_OP_KILL 25 588 #define CF_OP_END_PROGRAM 26 589 #define CF_OP_WAIT_ACK 27 590 #define CF_OP_TEX_ACK 28 591 #define CF_OP_VTX_ACK 29 592 #define CF_OP_VTX_TC_ACK 30 593 #define CF_OP_JUMPTABLE 31 594 #define CF_OP_WAVE_SYNC 32 595 #define CF_OP_HALT 33 596 #define CF_OP_CF_END 34 597 #define CF_OP_LDS_DEALLOC 35 598 #define CF_OP_PUSH_WQM 36 599 #define CF_OP_POP_WQM 37 600 #define CF_OP_ELSE_WQM 38 601 #define CF_OP_JUMP_ANY 39 602 #define CF_OP_REACTIVATE 40 603 #define CF_OP_REACTIVATE_WQM 41 604 #define CF_OP_INTERRUPT 42 605 #define CF_OP_INTERRUPT_AND_SLEEP 43 606 #define CF_OP_SET_PRIORITY 44 607 #define CF_OP_MEM_STREAM0_BUF0 45 608 #define CF_OP_MEM_STREAM0_BUF1 46 609 #define CF_OP_MEM_STREAM0_BUF2 47 610 #define CF_OP_MEM_STREAM0_BUF3 48 611 #define CF_OP_MEM_STREAM1_BUF0 49 612 #define CF_OP_MEM_STREAM1_BUF1 50 613 #define CF_OP_MEM_STREAM1_BUF2 51 614 #define CF_OP_MEM_STREAM1_BUF3 52 615 #define CF_OP_MEM_STREAM2_BUF0 53 616 #define CF_OP_MEM_STREAM2_BUF1 54 617 #define CF_OP_MEM_STREAM2_BUF2 55 618 #define CF_OP_MEM_STREAM2_BUF3 56 619 #define CF_OP_MEM_STREAM3_BUF0 57 620 #define CF_OP_MEM_STREAM3_BUF1 58 621 #define CF_OP_MEM_STREAM3_BUF2 59 622 #define CF_OP_MEM_STREAM3_BUF3 60 623 #define CF_OP_MEM_STREAM0 61 624 #define CF_OP_MEM_STREAM1 62 625 #define CF_OP_MEM_STREAM2 63 626 #define CF_OP_MEM_STREAM3 64 627 #define CF_OP_MEM_SCRATCH 65 628 #define CF_OP_MEM_REDUCT 66 629 #define CF_OP_MEM_RING 67 630 #define CF_OP_EXPORT 68 631 #define CF_OP_EXPORT_DONE 69 632 #define CF_OP_MEM_EXPORT 70 633 #define CF_OP_MEM_RAT 71 634 #define CF_OP_MEM_RAT_NOCACHE 72 635 #define CF_OP_MEM_RING1 73 636 #define CF_OP_MEM_RING2 74 637 #define CF_OP_MEM_RING3 75 638 #define CF_OP_MEM_MEM_COMBINED 76 639 #define CF_OP_MEM_RAT_COMBINED_NOCACHE 77 640 #define CF_OP_MEM_RAT_COMBINED 78 641 #define CF_OP_EXPORT_DONE_END 79 642 #define CF_OP_ALU 80 643 #define CF_OP_ALU_PUSH_BEFORE 81 644 #define CF_OP_ALU_POP_AFTER 82 645 #define CF_OP_ALU_POP2_AFTER 83 646 #define CF_OP_ALU_EXT 84 647 #define CF_OP_ALU_CONTINUE 85 648 #define CF_OP_ALU_BREAK 86 649 #define CF_OP_ALU_ELSE_AFTER 87 650 651 /* CF_NATIVE means that r600_bytecode_cf contains pre-encoded native data */ 652 #define CF_NATIVE 88 653 654 enum r600_chip_class { 655 ISA_CC_R600, 656 ISA_CC_R700, 657 ISA_CC_EVERGREEN, 658 ISA_CC_CAYMAN 659 }; 660 661 struct r600_isa { 662 enum r600_chip_class hw_class; 663 664 /* these arrays provide reverse mapping - opcode => table_index, 665 * typically we don't need such lookup, unless we are decoding the native 666 * bytecode (e.g. when reading the bytestream from llvm backend) */ 667 unsigned *alu_op2_map; 668 unsigned *alu_op3_map; 669 unsigned *fetch_map; 670 unsigned *cf_map; 671 }; 672 673 struct r600_context; 674 675 int r600_isa_init(struct r600_context *ctx, struct r600_isa *isa); 676 int r600_isa_destroy(struct r600_isa *isa); 677 678 extern const struct alu_op_info r600_alu_op_table[]; 679 680 unsigned 681 r600_alu_op_table_size(void); 682 683 const struct alu_op_info * 684 r600_isa_alu(unsigned op); 685 686 const struct fetch_op_info * 687 r600_isa_fetch(unsigned op); 688 689 const struct cf_op_info * 690 r600_isa_cf(unsigned op); 691 692 static inline unsigned 693 r600_isa_alu_opcode(enum r600_chip_class chip_class, unsigned op) { 694 int opc = r600_isa_alu(op)->opcode[chip_class >> 1]; 695 assert(opc != -1); 696 return opc; 697 } 698 699 static inline unsigned 700 r600_isa_alu_slots(enum r600_chip_class chip_class, unsigned op) { 701 unsigned slots = r600_isa_alu(op)->slots[chip_class]; 702 assert(slots != 0); 703 return slots; 704 } 705 706 static inline unsigned 707 r600_isa_fetch_opcode(enum r600_chip_class chip_class, unsigned op) { 708 int opc = r600_isa_fetch(op)->opcode[chip_class]; 709 assert(opc != -1); 710 return opc; 711 } 712 713 static inline unsigned 714 r600_isa_cf_opcode(enum r600_chip_class chip_class, unsigned op) { 715 int opc = r600_isa_cf(op)->opcode[chip_class]; 716 assert(opc != -1); 717 return opc; 718 } 719 720 static inline unsigned 721 r600_isa_alu_by_opcode(struct r600_isa* isa, unsigned opcode, unsigned is_op3) { 722 unsigned op; 723 if (is_op3) { 724 assert(isa->alu_op3_map); 725 op = isa->alu_op3_map[opcode]; 726 } else { 727 assert(isa->alu_op2_map); 728 op = isa->alu_op2_map[opcode]; 729 } 730 assert(op); 731 return op - 1; 732 } 733 734 static inline unsigned 735 r600_isa_fetch_by_opcode(struct r600_isa* isa, unsigned opcode) { 736 unsigned op; 737 assert(isa->fetch_map); 738 op = isa->fetch_map[opcode]; 739 assert(op); 740 return op - 1; 741 } 742 743 static inline unsigned 744 r600_isa_cf_by_opcode(struct r600_isa* isa, unsigned opcode, unsigned is_alu) { 745 unsigned op; 746 assert(isa->cf_map); 747 /* using offset for CF_ALU_xxx opcodes because they overlap with other 748 * CF opcodes (they use different encoding in hw) */ 749 op = isa->cf_map[is_alu ? opcode + 0x80 : opcode]; 750 assert(op); 751 return op - 1; 752 } 753 754 #ifdef __cplusplus 755 } /* extern "C" */ 756 #endif 757 758 #endif /* R600_ISA_H_ */ 759