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