Changeset 3104 in CLRX


Ignore:
Timestamp:
May 30, 2017, 7:03:17 AM (23 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add op_sel modifier to VOP3 encoding (AMD VEGA arch).

Location:
CLRadeonExtender/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdasm/GCNAsmHelpers.cpp

    r3099 r3104  
    15821582                uint16_t arch, cxbyte& mods, VOPOpModifiers& opMods, cxuint modOperands,
    15831583                VOPExtraModifiers* extraMods, bool withClamp, cxuint withSDWAOperands,
    1584                 bool withSext)
     1584                bool withSext, bool withOpSel)
    15851585{
    15861586    const char* end = asmr.line+asmr.lineSize;
     
    15911591    bool haveBoundCtrl = false, haveDppCtrl = false;
    15921592    bool haveNeg = false, haveAbs = false;
    1593     bool haveSext = false;
     1593    bool haveSext = false, haveOpsel = false;
    15941594   
    15951595    if (extraMods!=nullptr)
     
    17481748                                asmr.printWarning(modPlace, "Sext is already defined");
    17491749                            haveSext = true;
     1750                        }
     1751                    }
     1752                    else
     1753                        good = false;
     1754                }
     1755                else if (withOpSel && modOperands>1 && ::strcmp(mod, "op_sel")==0)
     1756                {
     1757                    uint32_t opselVal = 0;
     1758                    if (linePtr!=end && *linePtr==':')
     1759                    {
     1760                        linePtr++;
     1761                        if (parseImmWithBoolArray(asmr, linePtr, opselVal, modOperands,
     1762                                    WS_UNSIGNED))
     1763                        {
     1764                            opMods.opselMod = opselVal;
     1765                            if (haveOpsel)
     1766                                asmr.printWarning(modPlace, "Opsel is already defined");
     1767                            haveOpsel = true;
    17501768                        }
    17511769                    }
  • CLRadeonExtender/trunk/amdasm/GCNAsmInternals.h

    r3099 r3104  
    146146    cxbyte negMod;
    147147    cxbyte sextMod;
     148    cxbyte opselMod;
    148149};
    149150
     
    217218                       cxbyte& mods, VOPOpModifiers& opMods, cxuint modOperands,
    218219                       VOPExtraModifiers* extraMods = nullptr, bool withClamp = true,
    219                        cxuint withSDWAOperands = 3, bool withSext = true);
     220                       cxuint withSDWAOperands = 3, bool withSext = true,
     221                       bool withOpSel = false);
    220222   
    221223    static bool parseOperand(Assembler& asmr, const char*& linePtr, GCNOperand& operand,
  • CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp

    r3100 r3104  
    21232123    const uint16_t mode2 = (gcnInsn.mode & GCN_MASK2);
    21242124    const bool isGCN12 = (arch & ARCH_GCN_1_2_4)!=0;
     2125    const bool isGCN14 = (arch & ARCH_RXVEGA)!=0;
    21252126    if (gcnVOPEnc!=GCNVOPEnc::NORMAL)
    21262127    {
     
    21422143            INSTROP_VOP3NEG : INSTROP_VOP3MODS | INSTROP_NOSEXT;
    21432144   
     2145    VOPOpModifiers opMods{};
    21442146    cxuint operands = 1;
    21452147    if (mode1 != GCN_VOP_ARG_NONE)
     
    22112213            // high and vop3
    22122214            const char* end = asmr.line+asmr.lineSize;
     2215            bool haveOpsel = false;
    22132216            while (true)
    22142217            {
     
    22282231                    modifiers = (modifiers & ~VOP3_VOP3) | (vop3Mod ? VOP3_VOP3 : 0);
    22292232                }
     2233                else if (::strcmp(modName, "op_sel")==0)
     2234                {
     2235                    uint32_t opselVal = 0;
     2236                    if (linePtr!=end && *linePtr==':')
     2237                    {
     2238                        linePtr++;
     2239                        if (parseImmWithBoolArray(asmr, linePtr, opselVal, 4, WS_UNSIGNED))
     2240                        {
     2241                            opMods.opselMod = opselVal;
     2242                            if (haveOpsel)
     2243                                asmr.printWarning(modPlace, "Opsel is already defined");
     2244                            haveOpsel = true;
     2245                            opMods.opselMod = opselVal;
     2246                        }
     2247                    }
     2248                    else
     2249                        good = false;
     2250                }
    22302251                else
    22312252                {
     
    22702291    }
    22712292    // modifiers
    2272     VOPOpModifiers opMods{};
    22732293    if (mode2 != GCN_VOP3_VINTRP)
    22742294        good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods, operands,
    2275                     nullptr, isGCN12 || gcnInsn.encoding!=GCNENC_VOP3B, 3, false);
     2295                    nullptr, isGCN12 || gcnInsn.encoding!=GCNENC_VOP3B, 3, false,
     2296                    isGCN14 && (gcnInsn.mode & GCN_VOP3_OPSEL) != 0);
    22762297    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    22772298        return false;
     
    23482369                ((src0Op.vopMods & VOPOP_ABS) ? 0x100 : 0) |
    23492370                ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0) |
    2350                 ((src2Op.vopMods & VOPOP_ABS) ? 0x400 : 0));
     2371                ((src2Op.vopMods & VOPOP_ABS) ? 0x400 : 0) |
     2372                ((opMods.opselMod&15) << 11));
    23512373        else // VINTRP
    23522374        {
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc14.cpp

    r3103 r3104  
    400400    { "v_pack_b32_f16  v55, v27, v90\n", 0xd2a00037U, 0x0002b51bU, true, true, "" },
    401401    /* VOP3 op_sel */
     402    { "v_interp_p2_legacy_f16 v42, v1, attr39.z, s29 op_sel:[1,1,1,1]\n",
     403        0xd276782aU, 0x007602a7, true, true, "" },
     404    { "v_interp_p2_legacy_f16 v42, v1, attr39.z, s29 op_sel:15\n",
     405        0xd276782aU, 0x007602a7, true, true, "" },
     406    { "v_interp_p2_legacy_f16 v42, v1, attr39.z, s29 op_sel:[0,1,1,1]\n",
     407        0xd276702aU, 0x007602a7, true, true, "" },
     408    { "v_interp_p2_legacy_f16 v42, v1, attr39.z, s29 op_sel:14\n",
     409        0xd276702aU, 0x007602a7, true, true, "" },
     410    { "v_interp_p2_legacy_f16 v42, v1, attr39.z, s29 op_sel:[1,0,0,1]\n",
     411        0xd276482aU, 0x007602a7, true, true, "" },
     412    { "v_interp_p2_legacy_f16 v42, v1, attr39.z, s29 op_sel:9\n",
     413        0xd276482aU, 0x007602a7, true, true, "" },
     414    { "v_alignbit_b32  v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     415        0xd1ce5837U, 0x07974d4fU, true, true, "" },
     416    { "v_alignbit_b32  v55, v79, v166, v229 op_sel:0xb\n",
     417        0xd1ce5837U, 0x07974d4fU, true, true, "" },
    402418    { nullptr, 0, 0, false, false, 0 }
    403419};
Note: See TracChangeset for help on using the changeset viewer.