2 * Copyright (C) 2009 Nicolai Haehnle.
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:
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.
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.
28 #include "radeon_opcodes.h"
29 #include "radeon_program.h"
31 #include "radeon_program_constants.h"
33 struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE] = {
35 .Opcode = RC_OPCODE_NOP,
39 .Opcode = RC_OPCODE_ILLEGAL_OPCODE,
40 .Name = "ILLEGAL OPCODE"
43 .Opcode = RC_OPCODE_ABS,
50 .Opcode = RC_OPCODE_ADD,
57 .Opcode = RC_OPCODE_ARL,
63 .Opcode = RC_OPCODE_CEIL,
70 .Opcode = RC_OPCODE_CLAMP,
77 .Opcode = RC_OPCODE_CMP,
84 .Opcode = RC_OPCODE_CND,
91 .Opcode = RC_OPCODE_COS,
98 .Opcode = RC_OPCODE_DDX,
105 .Opcode = RC_OPCODE_DDY,
112 .Opcode = RC_OPCODE_DP2,
118 .Opcode = RC_OPCODE_DP3,
124 .Opcode = RC_OPCODE_DP4,
130 .Opcode = RC_OPCODE_DPH,
136 .Opcode = RC_OPCODE_DST,
142 .Opcode = RC_OPCODE_EX2,
146 .IsStandardScalar = 1
149 .Opcode = RC_OPCODE_EXP,
155 .Opcode = RC_OPCODE_FLR,
162 .Opcode = RC_OPCODE_FRC,
169 .Opcode = RC_OPCODE_KIL,
174 .Opcode = RC_OPCODE_LG2,
178 .IsStandardScalar = 1
181 .Opcode = RC_OPCODE_LIT,
187 .Opcode = RC_OPCODE_LOG,
193 .Opcode = RC_OPCODE_LRP,
200 .Opcode = RC_OPCODE_MAD,
207 .Opcode = RC_OPCODE_MAX,
214 .Opcode = RC_OPCODE_MIN,
221 .Opcode = RC_OPCODE_MOV,
228 .Opcode = RC_OPCODE_MUL,
235 .Opcode = RC_OPCODE_POW,
239 .IsStandardScalar = 1
242 .Opcode = RC_OPCODE_RCP,
246 .IsStandardScalar = 1
249 .Opcode = RC_OPCODE_ROUND,
256 .Opcode = RC_OPCODE_RSQ,
260 .IsStandardScalar = 1
263 .Opcode = RC_OPCODE_SCS,
269 .Opcode = RC_OPCODE_SEQ,
276 .Opcode = RC_OPCODE_SFL,
283 .Opcode = RC_OPCODE_SGE,
290 .Opcode = RC_OPCODE_SGT,
297 .Opcode = RC_OPCODE_SIN,
301 .IsStandardScalar = 1
304 .Opcode = RC_OPCODE_SLE,
311 .Opcode = RC_OPCODE_SLT,
318 .Opcode = RC_OPCODE_SNE,
325 .Opcode = RC_OPCODE_SSG,
332 .Opcode = RC_OPCODE_SUB,
339 .Opcode = RC_OPCODE_SWZ,
346 .Opcode = RC_OPCODE_XPD,
352 .Opcode = RC_OPCODE_TEX,
359 .Opcode = RC_OPCODE_TXB,
366 .Opcode = RC_OPCODE_TXD,
373 .Opcode = RC_OPCODE_TXL,
380 .Opcode = RC_OPCODE_TXP,
387 .Opcode = RC_OPCODE_IF,
393 .Opcode = RC_OPCODE_ELSE,
399 .Opcode = RC_OPCODE_ENDIF,
405 .Opcode = RC_OPCODE_BGNLOOP,
411 .Opcode = RC_OPCODE_BRK,
417 .Opcode = RC_OPCODE_ENDLOOP,
423 .Opcode = RC_OPCODE_CONT,
429 .Opcode = RC_OPCODE_REPL_ALPHA,
430 .Name = "REPL_ALPHA",
434 .Opcode = RC_OPCODE_BEGIN_TEX,
438 .Opcode = RC_OPCODE_KILP,
443 void rc_compute_sources_for_writemask(
444 const struct rc_instruction *inst,
445 unsigned int writemask,
446 unsigned int *srcmasks)
448 const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->U.I.Opcode);
453 if (opcode->Opcode == RC_OPCODE_KIL)
454 srcmasks[0] |= RC_MASK_XYZW;
455 else if (opcode->Opcode == RC_OPCODE_IF)
456 srcmasks[0] |= RC_MASK_X;
461 if (opcode->IsComponentwise) {
462 for(unsigned int src = 0; src < opcode->NumSrcRegs; ++src)
463 srcmasks[src] |= writemask;
464 } else if (opcode->IsStandardScalar) {
465 for(unsigned int src = 0; src < opcode->NumSrcRegs; ++src)
466 srcmasks[src] |= writemask;
468 switch(opcode->Opcode) {
470 srcmasks[0] |= RC_MASK_X;
473 srcmasks[0] |= RC_MASK_XY;
474 srcmasks[1] |= RC_MASK_XY;
478 srcmasks[0] |= RC_MASK_XYZ;
479 srcmasks[1] |= RC_MASK_XYZ;
482 srcmasks[0] |= RC_MASK_XYZW;
483 srcmasks[1] |= RC_MASK_XYZW;
486 srcmasks[0] |= RC_MASK_XYZ;
487 srcmasks[1] |= RC_MASK_XYZW;
492 srcmasks[0] |= RC_MASK_W;
495 switch (inst->U.I.TexSrcTarget) {
497 srcmasks[0] |= RC_MASK_X;
500 case RC_TEXTURE_RECT:
501 case RC_TEXTURE_1D_ARRAY:
502 srcmasks[0] |= RC_MASK_XY;
505 case RC_TEXTURE_CUBE:
506 case RC_TEXTURE_2D_ARRAY:
507 srcmasks[0] |= RC_MASK_XYZ;
512 switch (inst->U.I.TexSrcTarget) {
513 case RC_TEXTURE_1D_ARRAY:
514 srcmasks[0] |= RC_MASK_Y;
517 srcmasks[0] |= RC_MASK_X;
518 srcmasks[1] |= RC_MASK_X;
519 srcmasks[2] |= RC_MASK_X;
521 case RC_TEXTURE_2D_ARRAY:
522 srcmasks[0] |= RC_MASK_Z;
525 case RC_TEXTURE_RECT:
526 srcmasks[0] |= RC_MASK_XY;
527 srcmasks[1] |= RC_MASK_XY;
528 srcmasks[2] |= RC_MASK_XY;
531 case RC_TEXTURE_CUBE:
532 srcmasks[0] |= RC_MASK_XYZ;
533 srcmasks[1] |= RC_MASK_XYZ;
534 srcmasks[2] |= RC_MASK_XYZ;
539 srcmasks[0] |= RC_MASK_Y | RC_MASK_Z;
540 srcmasks[1] |= RC_MASK_Y | RC_MASK_W;
544 srcmasks[0] |= RC_MASK_XY;
547 srcmasks[0] |= RC_MASK_X | RC_MASK_Y | RC_MASK_W;