Changeset 3096 in CLRX


Ignore:
Timestamp:
May 29, 2017, 6:53:28 AM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add parametrizable modifers: abs, neg, sext.

Location:
CLRadeonExtender/trunk
Files:
6 edited

Legend:

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

    r3095 r3096  
    15351535 * withSDWAOperands - specify number of operand for that modifier will be parsed */
    15361536bool GCNAsmUtils::parseVOPModifiers(Assembler& asmr, const char*& linePtr,
    1537                 uint16_t arch, cxbyte& mods, VOPExtraModifiers* extraMods, bool withClamp,
    1538                 cxuint withSDWAOperands)
     1537                uint16_t arch, cxbyte& mods, VOPOpModifiers& opMods,
     1538                VOPExtraModifiers* extraMods, bool withClamp, cxuint withSDWAOperands)
    15391539{
    15401540    const char* end = asmr.line+asmr.lineSize;
     
    15451545    bool haveBoundCtrl = false, haveDppCtrl = false;
    15461546    bool haveNeg = false, haveAbs = false;
     1547    bool haveSext = false;
    15471548   
    15481549    if (extraMods!=nullptr)
    15491550        *extraMods = { 6, 0, cxbyte((withSDWAOperands>=2)?6:0),
    15501551                    cxbyte((withSDWAOperands>=3)?6:0),
    1551                     15, 15, 0xe4 /* TODO: why not 0xe4? */, false, false, 0U, 0U };
     1552                    15, 15, 0xe4 /* TODO: why not 0xe4? */, false, false };
    15521553   
    15531554    skipSpacesToEnd(linePtr, end);
     
    16511652                    }
    16521653                }
    1653                 /*else if (::strcmp(mod, "abs")==0)
     1654                else if (::strcmp(mod, "abs")==0)
    16541655                {
    16551656                    cxbyte absVal = 0;
     
    16571658                    {
    16581659                        linePtr++;
    1659                         if (parseImm(asmr, linePtr, absVal, nullptr, 2, WS_UNSIGNED))
    1660                         {
    1661                             extraMods->absMod = absVal;
     1660                        if (parseImm(asmr, linePtr, absVal, nullptr, 3, WS_UNSIGNED))
     1661                        {
     1662                            opMods.absMod = absVal;
    16621663                            if (haveAbs)
    16631664                                asmr.printWarning(modPlace, "Abs is already defined");
     
    16741675                    {
    16751676                        linePtr++;
    1676                         if (parseImm(asmr, linePtr, negVal, nullptr, 2, WS_UNSIGNED))
    1677                         {
    1678                             extraMods->negMod = negVal;
     1677                        if (parseImm(asmr, linePtr, negVal, nullptr, 3, WS_UNSIGNED))
     1678                        {
     1679                            opMods.negMod = negVal;
    16791680                            if (haveNeg)
    16801681                                asmr.printWarning(modPlace, "Neg is already defined");
     
    16841685                    else
    16851686                        good = false;
    1686                 }*/
     1687                }
     1688                else if ((arch & ARCH_GCN_1_2_4) && ::strcmp(mod, "sext")==0)
     1689                {
     1690                    cxbyte sextVal = 0;
     1691                    if (linePtr!=end && *linePtr==':')
     1692                    {
     1693                        linePtr++;
     1694                        if (parseImm(asmr, linePtr, sextVal, nullptr, 2, WS_UNSIGNED))
     1695                        {
     1696                            opMods.sextMod = sextVal;
     1697                            if (haveSext)
     1698                                asmr.printWarning(modPlace, "Sext is already defined");
     1699                            haveSext = true;
     1700                        }
     1701                    }
     1702                    else
     1703                        good = false;
     1704                }
    16871705                else if (::strcmp(mod, "vop3")==0)
    16881706                {
  • CLRadeonExtender/trunk/amdasm/GCNAsmInternals.h

    r3095 r3096  
    138138    bool needSDWA;
    139139    bool needDPP;
     140};
     141
     142struct CLRX_INTERNAL VOPOpModifiers
     143{
    140144    cxbyte absMod;
    141145    cxbyte negMod;
     146    cxbyte sextMod;
    142147};
    143148
     
    205210     * (includes destination at begin) */
    206211    static bool parseVOPModifiers(Assembler& asmr, const char*& linePtr, uint16_t arch,
    207                        cxbyte& mods, VOPExtraModifiers* extraMods = nullptr,
    208                        bool withClamp = true, cxuint withSDWAOperands = 3);
     212                       cxbyte& mods, VOPOpModifiers& opMods,
     213                       VOPExtraModifiers* extraMods = nullptr, bool withClamp = true,
     214                       cxuint withSDWAOperands = 3);
    209215   
    210216    static bool parseOperand(Assembler& asmr, const char*& linePtr, GCNOperand& operand,
  • CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp

    r3092 r3096  
    15171517    cxbyte modifiers = 0;
    15181518    VOPExtraModifiers extraMods{};
    1519     good &= parseVOPModifiers(asmr, linePtr, arch, modifiers,
     1519    VOPOpModifiers opMods{};
     1520    good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods,
    15201521                    (isGCN12) ? &extraMods : nullptr, !haveDstCC || isGCN12);
    15211522    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    15221523        return false;
     1524   
     1525    if (src0Op)
     1526        src0Op.vopMods |= ((opMods.absMod&1) ? VOPOP_ABS : 0) |
     1527                ((opMods.negMod&1) ? VOPOP_NEG : 0) |
     1528                ((opMods.sextMod&1) ? VOPOP_SEXT : 0);
     1529    if (src1Op)
     1530        src1Op.vopMods |= ((opMods.absMod&2) ? VOPOP_ABS : 0) |
     1531                ((opMods.negMod&2) ? VOPOP_NEG : 0) |
     1532                ((opMods.sextMod&2) ? VOPOP_SEXT : 0);
    15231533   
    15241534    bool vop3 = /* src1=sgprs and not (DS1_SGPR|src1_SGPR) */
     
    17491759    // modifiers
    17501760    VOPExtraModifiers extraMods{};
    1751     good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, (isGCN12)?&extraMods:nullptr,
    1752                   true, (mode1!=GCN_VOP_ARG_NONE) ? 2 : 0);
     1761    VOPOpModifiers opMods{};
     1762    good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods,
     1763                  (isGCN12)?&extraMods:nullptr, true, (mode1!=GCN_VOP_ARG_NONE) ? 2 : 0);
    17531764    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    17541765        return false;
     1766   
     1767    if (src0Op)
     1768        src0Op.vopMods |= ((opMods.absMod&1) ? VOPOP_ABS : 0) |
     1769                ((opMods.negMod&1) ? VOPOP_NEG : 0) |
     1770                ((opMods.sextMod&1) ? VOPOP_SEXT : 0);
    17551771   
    17561772    bool vop3 = ((!isGCN12 && src0Op.vopMods!=0) ||
     
    19031919    // modifiers
    19041920    VOPExtraModifiers extraMods{};
    1905     good &= parseVOPModifiers(asmr, linePtr, arch, modifiers,
     1921    VOPOpModifiers opMods{};
     1922    good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods,
    19061923                        (isGCN12)?&extraMods:nullptr, true);
    19071924    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    19081925        return false;
     1926   
     1927    if (src0Op)
     1928        src0Op.vopMods |= ((opMods.absMod&1) ? VOPOP_ABS : 0) |
     1929                ((opMods.negMod&1) ? VOPOP_NEG : 0) |
     1930                ((opMods.sextMod&1) ? VOPOP_SEXT : 0);
     1931    if (src1Op)
     1932        src1Op.vopMods |= ((opMods.absMod&2) ? VOPOP_ABS : 0) |
     1933                ((opMods.negMod&2) ? VOPOP_NEG : 0) |
     1934                ((opMods.sextMod&2) ? VOPOP_SEXT : 0);
    19091935   
    19101936    bool vop3 = //(dstReg.start!=106) || (src1Op.range.start<256) ||
     
    21912217    }
    21922218    // modifiers
     2219    VOPOpModifiers opMods{};
    21932220    if (mode2 != GCN_VOP3_VINTRP)
    2194         good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, nullptr,
     2221        good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods, nullptr,
    21952222                              isGCN12 || gcnInsn.encoding!=GCNENC_VOP3B);
    21962223    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    21972224        return false;
     2225   
     2226    if (src0Op)
     2227        src0Op.vopMods |= ((opMods.absMod&1) ? VOPOP_ABS : 0) |
     2228                ((opMods.negMod&1) ? VOPOP_NEG : 0) |
     2229                ((opMods.sextMod&1) ? VOPOP_SEXT : 0);
     2230    if (src1Op)
     2231        src1Op.vopMods |= ((opMods.absMod&2) ? VOPOP_ABS : 0) |
     2232                ((opMods.negMod&2) ? VOPOP_NEG : 0) |
     2233                ((opMods.sextMod&2) ? VOPOP_SEXT : 0);
     2234    if (src2Op)
     2235        src2Op.vopMods |= ((opMods.absMod&4) ? VOPOP_ABS : 0) |
     2236                ((opMods.negMod&4) ? VOPOP_NEG : 0);
    21982237   
    21992238    if (mode2 != GCN_VOP3_VINTRP)
  • CLRadeonExtender/trunk/doc/GcnOperands.md

    r3094 r3096  
    167167Special case is `bound_ctrl`. To parametrize bound_ctrl you must use syntax:
    168168`bound_ctrl:0:expr` or `bound_ctrl:1:expr`.
     169The `abs`, `neg` and `sext` modifiers with parameter (expression) allow to set what
     170source operand will have operand modifier. Number of bit of value refer to number of source operand.
    169171
    170172The HW registers and send message parameters (message and GSOP) is parametrizable if
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc11.cpp

    r3091 r3096  
    606606    { "    v_add_f32  v154, abs(v21), abs(v107)",
    607607        0xd206039aU, 0x0002d715U, true, true, "" },
     608    { "    v_add_f32  v154, v21, v107 abs:3",
     609        0xd206039aU, 0x0002d715U, true, true, "" },
    608610    { "    v_add_f32  v154, v21, abs(v107)", 0xd206029aU, 0x0002d715U, true, true, "" },
    609611    { "    v_add_f32  v154, -v21, v107", 0xd206009aU, 0x2002d715U, true, true, "" },
    610612    { "    v_add_f32  v154, v21, -v107", 0xd206009aU, 0x4002d715U, true, true, "" },
     613    { "    v_add_f32  v154, v21, v107 neg:2", 0xd206009aU, 0x4002d715U, true, true, "" },
    611614    { "    v_add_f32  v154, -v21, -v107", 0xd206009aU, 0x6002d715U, true, true, "" },
    612615    { "    v_add_f32  v154, -abs(v21), -abs(v107)",
     616        0xd206039aU, 0x6002d715U, true, true, "" },
     617    { "    v_add_f32  v154, v21, v107 neg:3 abs:3",
    613618        0xd206039aU, 0x6002d715U, true, true, "" },
    614619    { "    v_add_f32  v154, v21, v107 mul:2", 0xd206009aU, 0x0802d715U, true, true, "" },
     
    16421647    { "   v_mad_legacy_f32 v55, v79, v166, abs(v229)",
    16431648        0xd2800437U, 0x07974d4fU, true, true, "" },
     1649    { "   v_mad_legacy_f32 v55, v79, v166, v229 abs:4",
     1650        0xd2800437U, 0x07974d4fU, true, true, "" },
    16441651    { "   v_mad_legacy_f32 v55, -v79, v166, v229",
    16451652        0xd2800037U, 0x27974d4fU, true, true, "" },
     
    16471654        0xd2800037U, 0x47974d4fU, true, true, "" },
    16481655    { "   v_mad_legacy_f32 v55, v79, v166, -v229",
     1656        0xd2800037U, 0x87974d4fU, true, true, "" },
     1657    { "   v_mad_legacy_f32 v55, v79, v166, v229 neg:4",
    16491658        0xd2800037U, 0x87974d4fU, true, true, "" },
    16501659    { "   v_mad_legacy_f32 v55, v79, v166, v229 clamp",
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc12.cpp

    r3094 r3096  
    337337    { "   v_cndmask_b32   v154, v65, sext(-abs(v107)), vcc dst_sel:word1",
    338338        0x0134d6f9U, 0x3e060541U, true, true, "" },
     339    { "   v_cndmask_b32   v154, v65, v107, vcc dst_sel:word1 sext:2 neg:2 abs:2",
     340        0x0134d6f9U, 0x3e060541U, true, true, "" },
    339341    { "   v_cndmask_b32   v154, v65, sext(-v107), vcc dst_sel:word1",
     342        0x0134d6f9U, 0x1e060541U, true, true, "" },
     343    { "   v_cndmask_b32   v154, v65, v107, vcc dst_sel:word1 sext:2 neg:2",
    340344        0x0134d6f9U, 0x1e060541U, true, true, "" },
    341345    { "   v_cndmask_b32   v154, abs(v65), v107, vcc clamp dst_sel:word1",
Note: See TracChangeset for help on using the changeset viewer.