Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.