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