Changeset 3105 in CLRX


Ignore:
Timestamp:
May 30, 2017, 5:45:57 PM (21 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add VOP3P instructions and encoding (AMD VEGA arch).

Location:
CLRadeonExtender/trunk
Files:
5 edited

Legend:

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

    r3104 r3105  
    10011001                             instrOpMask & ~INSTROP_VOP3MODS, regField);
    10021002       
    1003         if ((arch & ARCH_GCN_1_2_4)!=0 && (instrOpMask & INSTROP_NOSEXT)==0 &&
     1003        if ((arch & ARCH_GCN_1_2_4)!=0 &&
     1004            (instrOpMask & (INSTROP_NOSEXT|INSTROP_VOP3P))==0 &&
    10041005            linePtr+4 <= end && toLower(linePtr[0])=='s' &&
    10051006            toLower(linePtr[1])=='e' && toLower(linePtr[2])=='x' &&
     
    10271028        }
    10281029        bool llvmAbs = false;
    1029         if (linePtr+3 <= end && toLower(linePtr[0])=='a' &&
     1030        if (linePtr+3 <= end && (instrOpMask & INSTROP_VOP3P)==0 &&
     1031            toLower(linePtr[0])=='a' &&
    10301032            toLower(linePtr[1])=='b' && toLower(linePtr[2])=='s')
    10311033        {
     
    15811583bool GCNAsmUtils::parseVOPModifiers(Assembler& asmr, const char*& linePtr,
    15821584                uint16_t arch, cxbyte& mods, VOPOpModifiers& opMods, cxuint modOperands,
    1583                 VOPExtraModifiers* extraMods, bool withClamp, cxuint withSDWAOperands,
    1584                 bool withSext, bool withOpSel)
     1585                VOPExtraModifiers* extraMods, cxuint flags, cxuint withSDWAOperands)
    15851586{
    15861587    const char* end = asmr.line+asmr.lineSize;
     
    15921593    bool haveNeg = false, haveAbs = false;
    15931594    bool haveSext = false, haveOpsel = false;
     1595    bool haveNegHi = false, haveOpselHi = false;
    15941596   
    15951597    if (extraMods!=nullptr)
     
    16021604    bool good = true;
    16031605    mods = 0;
     1606    const bool vop3p = (flags & PARSEVOP_VOP3P)!=0;
    16041607    while (linePtr != end)
    16051608    {
     
    16151618            {
    16161619                bool alreadyModDefined = false;
    1617                 if (::strcmp(mod, "mul")==0)
     1620                if (!vop3p && ::strcmp(mod, "mul")==0)
    16181621                {
    16191622                    skipSpacesToEnd(linePtr, end);
     
    16441647                    }
    16451648                }
    1646                 else if (::strcmp(mod, "div")==0)
     1649                else if (!vop3p && ::strcmp(mod, "div")==0)
    16471650                {
    16481651                    skipSpacesToEnd(linePtr, end);
     
    16681671                    }
    16691672                }
    1670                 else if (::strcmp(mod, "omod")==0)
     1673                else if (!vop3p && ::strcmp(mod, "omod")==0)
    16711674                {
    16721675                    skipSpacesToEnd(linePtr, end);
     
    16901693                    bool clamp = false;
    16911694                    good &= parseModEnable(asmr, linePtr, clamp, "clamp modifier");
    1692                     if (withClamp)
     1695                    if (flags & PARSEVOP_WITHCLAMP)
    16931696                        mods = (mods & ~VOP3_CLAMP) | (clamp ? VOP3_CLAMP : 0);
    16941697                    else
     
    16981701                    }
    16991702                }
    1700                 else if (modOperands>1 && ::strcmp(mod, "abs")==0)
     1703                else if (!vop3p && modOperands>1 && ::strcmp(mod, "abs")==0)
    17011704                {
    17021705                    uint32_t absVal = 0;
     
    17161719                        good = false;
    17171720                }
    1718                 else if (modOperands>1 && ::strcmp(mod, "neg")==0)
     1721                else if (modOperands>1 && (::strcmp(mod, "neg")==0 ||
     1722                        (vop3p && ::strcmp(mod, "neg_lo")==0)))
    17191723                {
    17201724                    uint32_t negVal = 0;
     
    17251729                                        WS_UNSIGNED))
    17261730                        {
    1727                             opMods.negMod = negVal;
     1731                            opMods.negMod = (opMods.negMod&0xf0) | negVal;
    17281732                            if (haveNeg)
    17291733                                asmr.printWarning(modPlace, "Neg is already defined");
     
    17341738                        good = false;
    17351739                }
    1736                 else if ((arch & ARCH_GCN_1_2_4) && withSext &&
     1740                else if (modOperands>1 && vop3p && ::strcmp(mod, "neg_hi")==0)
     1741                {
     1742                    uint32_t negVal = 0;
     1743                    if (linePtr!=end && *linePtr==':')
     1744                    {
     1745                        linePtr++;
     1746                        if (parseImmWithBoolArray(asmr, linePtr, negVal, modOperands-1,
     1747                                        WS_UNSIGNED))
     1748                        {
     1749                            opMods.negMod = (opMods.negMod&15) | (negVal<<4);
     1750                            if (haveNegHi)
     1751                                asmr.printWarning(modPlace, "Neg_hi is already defined");
     1752                            haveNegHi = true;
     1753                        }
     1754                    }
     1755                    else
     1756                        good = false;
     1757                }
     1758                else if (!vop3p &&(arch & ARCH_GCN_1_2_4) &&
     1759                        (flags & PARSEVOP_WITHSEXT)!=0 &&
    17371760                         modOperands>1 && ::strcmp(mod, "sext")==0)
    17381761                {
     
    17531776                        good = false;
    17541777                }
    1755                 else if (withOpSel && modOperands>1 && ::strcmp(mod, "op_sel")==0)
     1778                else if ((flags & PARSEVOP_WITHOPSEL) != 0 && modOperands>1 &&
     1779                            ::strcmp(mod, "op_sel")==0)
    17561780                {
    17571781                    uint32_t opselVal = 0;
     
    17591783                    {
    17601784                        linePtr++;
    1761                         if (parseImmWithBoolArray(asmr, linePtr, opselVal, modOperands,
     1785                        if (parseImmWithBoolArray(asmr, linePtr, opselVal,
     1786                                (vop3p ? modOperands-1 : modOperands),
    17621787                                    WS_UNSIGNED))
    17631788                        {
    1764                             opMods.opselMod = opselVal;
     1789                            opMods.opselMod = (opMods.opselMod&0xf0) | opselVal;
    17651790                            if (haveOpsel)
    17661791                                asmr.printWarning(modPlace, "Opsel is already defined");
    17671792                            haveOpsel = true;
     1793                        }
     1794                    }
     1795                    else
     1796                        good = false;
     1797                }
     1798                else if (vop3p && (flags & PARSEVOP_WITHOPSEL) != 0 && modOperands>1 &&
     1799                            ::strcmp(mod, "op_sel_hi")==0)
     1800                {
     1801                    uint32_t opselVal = 0;
     1802                    if (linePtr!=end && *linePtr==':')
     1803                    {
     1804                        linePtr++;
     1805                        if (parseImmWithBoolArray(asmr, linePtr, opselVal, modOperands-1,
     1806                                    WS_UNSIGNED))
     1807                        {
     1808                            opMods.opselMod = (opMods.opselMod&15) | (opselVal<<4);
     1809                            if (haveOpselHi)
     1810                                asmr.printWarning(modPlace, "Opsel_hi is already defined");
     1811                            haveOpselHi = true;
    17681812                        }
    17691813                    }
  • CLRadeonExtender/trunk/amdasm/GCNAsmInternals.h

    r3104 r3105  
    5959    INSTROP_ACCESS_MASK = 0x30000,
    6060    INSTROP_NOSEXT = 0x40000,
     61    INSTROP_VOP3P = 0x80000, // VOP3P encoding
    6162   
    6263    // for parseSRregRange/parseVRegRange
     
    129130
    130131struct CLRX_INTERNAL VOPExtraModifiers
    131 {   // TODO: check that for MSVC 2015
     132{
    132133    cxbyte dstSel;
    133134    cxbyte dstUnused;
     
    144145{
    145146    cxbyte absMod;
    146     cxbyte negMod;
     147    cxbyte negMod; // lo (low 4-bits) and hi (high 4-bits)
    147148    cxbyte sextMod;
    148     cxbyte opselMod;
     149    cxbyte opselMod; // lo (low 4-bits) and hi (high 4-bits)
    149150};
    150151
     
    161162    DPP,
    162163    SDWA
     164};
     165
     166enum {
     167    PARSEVOP_WITHCLAMP = 1,
     168    PARSEVOP_WITHSEXT = 2,
     169    PARSEVOP_WITHOPSEL = 4,
     170    PARSEVOP_VOP3P = 8
    163171};
    164172
     
    217225    static bool parseVOPModifiers(Assembler& asmr, const char*& linePtr, uint16_t arch,
    218226                       cxbyte& mods, VOPOpModifiers& opMods, cxuint modOperands,
    219                        VOPExtraModifiers* extraMods = nullptr, bool withClamp = true,
    220                        cxuint withSDWAOperands = 3, bool withSext = true,
    221                        bool withOpSel = false);
     227                       VOPExtraModifiers* extraMods = nullptr,
     228                       cxuint flags = PARSEVOP_WITHCLAMP|PARSEVOP_WITHSEXT,
     229                       cxuint withSDWAOperands = 3);
    222230   
    223231    static bool parseOperand(Assembler& asmr, const char*& linePtr, GCNOperand& operand,
  • CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp

    r3104 r3105  
    15221522    VOPOpModifiers opMods{};
    15231523    good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods, 3,
    1524                     (isGCN12) ? &extraMods : nullptr, !haveDstCC || isGCN12);
     1524                    (isGCN12) ? &extraMods : nullptr,
     1525                    ((!haveDstCC || isGCN12) ? PARSEVOP_WITHCLAMP : 0)|PARSEVOP_WITHSEXT);
    15251526    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    15261527        return false;
     
    16681669                    (src0Op.range.isNonVGPR() ? (1U<<23) : 0) |
    16691670                    (src1Op.range.isNonVGPR() ? (1U<<31) : 0) |
    1670                     ((modifiers & 3) << 14));
     1671                    (uint32_t(modifiers & 3) << 14));
    16711672        else if (extraMods.needDPP)
    16721673            SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) |
     
    16981699                ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0));
    16991700        SLEV(words[1], src0Op.range.bstart() | (uint32_t(src1Op.range.bstart())<<9) |
    1700             (uint32_t(srcCCReg.bstart())<<18) | ((modifiers & 3) << 27) |
     1701            (uint32_t(srcCCReg.bstart())<<18) | (uint32_t(modifiers & 3) << 27) |
    17011702            ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0) |
    17021703            ((src1Op.vopMods & VOPOP_NEG) ? (1U<<30) : 0));
     
    17811782    VOPOpModifiers opMods{};
    17821783    good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods,
    1783                   (mode1!=GCN_VOP_ARG_NONE) ? 2 : 0,
    1784                   (isGCN12)?&extraMods:nullptr, true, (mode1!=GCN_VOP_ARG_NONE) ? 2 : 0);
     1784                  (mode1!=GCN_VOP_ARG_NONE) ? 2 : 0, (isGCN12)?&extraMods:nullptr,
     1785                  PARSEVOP_WITHCLAMP|PARSEVOP_WITHSEXT, (mode1!=GCN_VOP_ARG_NONE) ? 2 : 0);
    17851786    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    17861787        return false;
     
    18631864                    ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) |
    18641865                    (src0Op.range.isNonVGPR() ? (1U<<23) : 0) |
    1865                     ((modifiers & 3) << 14));
     1866                    (uint32_t(modifiers & 3) << 14));
    18661867        else if (extraMods.needDPP)
    18671868            SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) |
     
    18811882        SLEV(words[0], 0xd0000000U | code | (dstReg.bstart()&0xff) |
    18821883            ((src0Op.vopMods & VOPOP_ABS) ? 0x100 : 0));
    1883         SLEV(words[1], src0Op.range.bstart() | ((modifiers & 3) << 27) |
     1884        SLEV(words[1], src0Op.range.bstart() | (uint32_t(modifiers & 3) << 27) |
    18841885            ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0));
    18851886        wordsNum++;
     
    19541955    VOPOpModifiers opMods{};
    19551956    good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods, 3,
    1956                         (isGCN12)?&extraMods:nullptr, true);
     1957                (isGCN12)?&extraMods:nullptr, PARSEVOP_WITHCLAMP|PARSEVOP_WITHSEXT);
    19571958    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    19581959        return false;
     
    20662067                    (src0Op.range.isNonVGPR() ? (1U<<23) : 0) |
    20672068                    (src1Op.range.isNonVGPR() ? (1U<<31) : 0) |
    2068                     ((modifiers & 3) << 14));
     2069                    (uint32_t(modifiers & 3) << 14));
    20692070        else if (extraMods.needDPP)
    20702071            SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) |
     
    20902091                ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0));
    20912092        SLEV(words[1], src0Op.range.bstart() | (uint32_t(src1Op.range.bstart())<<9) |
    2092             ((modifiers & 3) << 27) | ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0) |
     2093            (uint32_t(modifiers & 3) << 27) |
     2094            ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0) |
    20932095            ((src1Op.vopMods & VOPOP_NEG) ? (1U<<30) : 0));
    20942096        wordsNum++;
     
    21242126    const bool isGCN12 = (arch & ARCH_GCN_1_2_4)!=0;
    21252127    const bool isGCN14 = (arch & ARCH_RXVEGA)!=0;
     2128    const bool vop3p = (gcnInsn.mode & GCN_VOP3_VOP3P) != 0;
    21262129    if (gcnVOPEnc!=GCNVOPEnc::NORMAL)
    21272130    {
     
    21402143    bool modHigh = false;
    21412144    cxbyte modifiers = 0;
    2142     const Flags vop3Mods = (gcnInsn.encoding == GCNENC_VOP3B) ?
    2143             INSTROP_VOP3NEG : INSTROP_VOP3MODS | INSTROP_NOSEXT;
    2144    
    2145     VOPOpModifiers opMods{};
     2145    const Flags vop3Mods = ((gcnInsn.encoding == GCNENC_VOP3B) ?
     2146            INSTROP_VOP3NEG : INSTROP_VOP3MODS | INSTROP_NOSEXT) |
     2147            (vop3p ? INSTROP_VOP3P : 0);
     2148   
     2149    // by default OPSEL_HI is [1,1,1] in vop3p instructions
     2150    VOPOpModifiers opMods{ 0, 0, 0, cxbyte(vop3p ? 7<<4 : 0) };
    21462151    cxuint operands = 1;
    21472152    if (mode1 != GCN_VOP_ARG_NONE)
     
    22932298    if (mode2 != GCN_VOP3_VINTRP)
    22942299        good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods, operands,
    2295                     nullptr, isGCN12 || gcnInsn.encoding!=GCNENC_VOP3B, 3, false,
    2296                     isGCN14 && (gcnInsn.mode & GCN_VOP3_OPSEL) != 0);
     2300                    nullptr, ((isGCN12 || gcnInsn.encoding!=GCNENC_VOP3B) ?
     2301                            PARSEVOP_WITHCLAMP : 0) |
     2302                    ((isGCN14 && (gcnInsn.mode & GCN_VOP3_OPSEL) != 0) ?
     2303                            PARSEVOP_WITHOPSEL : 0) | (vop3p ? PARSEVOP_VOP3P : 0), 3);
    22972304    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    22982305        return false;
     
    23672374            SLEV(words[0], 0xd0000000U | (uint32_t(gcnInsn.code1)<<16) |
    23682375                (dstReg.bstart()&0xff) | ((modifiers&VOP3_CLAMP) ? 0x8000: 0) |
    2369                 ((src0Op.vopMods & VOPOP_ABS) ? 0x100 : 0) |
    2370                 ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0) |
    2371                 ((src2Op.vopMods & VOPOP_ABS) ? 0x400 : 0) |
     2376                (vop3p ? (uint32_t(opMods.negMod>>4) << 8) /* VOP3P NEG_HI */ :
     2377                    ((src0Op.vopMods & VOPOP_ABS) ? 0x100 : 0) |
     2378                    ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0) |
     2379                    ((src2Op.vopMods & VOPOP_ABS) ? 0x400 : 0)) |
     2380                (((opMods.opselMod & 64) !=0) ? 0x4000 : 0) |
    23722381                ((opMods.opselMod&15) << 11));
    23732382        else // VINTRP
     
    23822391    if (wordsNum==2)
    23832392        SLEV(words[1], src0Op.range.bstart() | (uint32_t(src1Op.range.bstart())<<9) |
    2384                 (uint32_t(src2Op.range.bstart())<<18) | ((modifiers & 3) << 27) |
     2393                (uint32_t(src2Op.range.bstart())<<18) |
     2394                (vop3p ? ((uint32_t(opMods.opselMod>>4)&3)<<27) :
     2395                 (uint32_t(modifiers & 3) << 27)) |
     2396                /* in VOP3P is also NEG_LO */
    23852397                ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0) |
    23862398                ((src1Op.vopMods & VOPOP_NEG) ? (1U<<30) : 0) |
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc12.cpp

    r3098 r3105  
    680680    { "    v_mov_b32  v158, sext(abs(v79))", 0x7f3c02f9U, 0x2e064fU, true, true, "" },
    681681    { "    v_mov_b32  v158, sext(-abs(v79))", 0x7f3c02f9U, 0x3e064fU, true, true, "" },
     682    { "    v_mov_b32  v158, v79 abs:1 neg:1 sext:1",
     683        0x7f3c02f9U, 0x3e064fU, true, true, "" },
    682684    { "    v_mov_b32  v158, v79 dst_sel:w1 src0_sel:b2 dst_un:preserve",
    683685        0x7f3c02f9U, 0x02154fU, true, true, "" },
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc14.cpp

    r3104 r3105  
    416416    { "v_alignbit_b32  v55, v79, v166, v229 op_sel:0xb\n",
    417417        0xd1ce5837U, 0x07974d4fU, true, true, "" },
     418    { "v_alignbit_b32  v55, v79, v166, v229 op_sel:[0,1,1,0]\n",
     419        0xd1ce3037U, 0x07974d4fU, true, true, "" },
     420    { "v_alignbit_b32  v55, v79, v166, v229 op_sel:0x6\n",
     421        0xd1ce3037U, 0x07974d4fU, true, true, "" },
     422    /* VOP3 op_sel instructions */
     423    { "v_alignbit_b32  v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     424        0xd1ce5837U, 0x07974d4fU, true, true, "" },
     425    { "v_alignbyte_b32 v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     426        0xd1cf5837U, 0x07974d4fU, true, true, "" },
     427    { "v_mad_legacy_f16 v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     428        0xd1ea5837U, 0x07974d4fU, true, true, "" },
     429    { "v_mad_legacy_u16 v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     430        0xd1eb5837U, 0x07974d4fU, true, true, "" },
     431    { "v_mad_legacy_i16 v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     432        0xd1ec5837U, 0x07974d4fU, true, true, "" },
     433    { "v_fma_legacy_f16 v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     434        0xd1ee5837U, 0x07974d4fU, true, true, "" },
     435    { "v_div_fixup_legacy_f16 v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     436        0xd1ef5837U, 0x07974d4fU, true, true, "" },
     437    { "v_min3_f16      v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     438        0xd1f45837U, 0x07974d4fU, true, true, "" },
     439    { "v_min3_i16      v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     440        0xd1f55837U, 0x07974d4fU, true, true, "" },
     441    { "v_min3_u16      v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     442        0xd1f65837U, 0x07974d4fU, true, true, "" },
     443    { "v_max3_f16      v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     444        0xd1f75837U, 0x07974d4fU, true, true, "" },
     445    { "v_max3_i16      v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     446        0xd1f85837U, 0x07974d4fU, true, true, "" },
     447    { "v_max3_u16      v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     448        0xd1f95837U, 0x07974d4fU, true, true, "" },
     449    { "v_med3_f16      v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     450        0xd1fa5837U, 0x07974d4fU, true, true, "" },
     451    { "v_med3_i16      v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     452        0xd1fb5837U, 0x07974d4fU, true, true, "" },
     453    { "v_med3_u16      v55, v79, v166, v229 op_sel:[1,1,0,1]\n",
     454        0xd1fc5837U, 0x07974d4fU, true, true, "" },
     455    { "v_cvt_pknorm_i16_f16 v55, v27, v90 op_sel:[1,1,0]\n",
     456        0xd2991837U, 0x0002b51bU, true, true, "" },
     457    { "v_cvt_pknorm_u16_f16 v55, v27, v90 op_sel:[1,1,0]\n",
     458        0xd29a1837U, 0x0002b51bU, true, true, "" },
     459    { "v_add_i16       v55, v27, v90 op_sel:[1,1,0]\n",
     460        0xd29e1837U, 0x0002b51bU, true, true, "" },
     461    { "v_sub_i16       v55, v27, v90 op_sel:[1,1,0]\n",
     462        0xd29f1837U, 0x0002b51bU, true, true, "" },
     463    { "v_pack_b32_f16  v55, v27, v90 op_sel:[1,1,0]\n",
     464        0xd2a01837U, 0x0002b51bU, true, true, "" },
     465    /* VOP3P encoding */
     466    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel_hi:[0,0,0]\n",
     467        0xd3800037U, 0x07974d4fU, true, true, "" },
     468    { "v_pk_mad_i16    v55, v79, v166, v229\n",
     469        0xd3804037U, 0x1f974d4fU, true, true, "" },
     470    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel_hi:[1,0,0]\n",
     471        0xd3800037U, 0x0f974d4fU, true, true, "" },
     472    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel_hi:[0,1,0]\n",
     473        0xd3800037U, 0x17974d4fU, true, true, "" },
     474    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel_hi:[0,1,1]\n",
     475        0xd3804037U, 0x17974d4fU, true, true, "" },
     476    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel_hi:6\n",
     477        0xd3804037U, 0x17974d4fU, true, true, "" },
     478    { "v_pk_add_i16    v55, v79, v166 op_sel_hi:[0,1]\n",
     479        0xd3820037U, 0x10034d4fU, true, true, "" },
     480    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel:[1,0,0] op_sel_hi:[0,0,0]\n",
     481        0xd3800837U, 0x07974d4fU, true, true, "" },
     482    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel:[1,0,0] op_sel_hi:[1,0,1]\n",
     483        0xd3804837U, 0x0f974d4fU, true, true, "" },
     484    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel:[1,0,0]\n",
     485        0xd3804837U, 0x1f974d4fU, true, true, "" },
     486    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel:[0,1,0] op_sel_hi:[0,0,0]\n",
     487        0xd3801037U, 0x07974d4fU, true, true, "" },
     488    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel:[0,0,1] op_sel_hi:[0,0,0]\n",
     489        0xd3802037U, 0x07974d4fU, true, true, "" },
     490    { "v_pk_mad_i16    v55, v79, v166, v229 op_sel:4 op_sel_hi:[0,0,0]\n",
     491        0xd3802037U, 0x07974d4fU, true, true, "" },
     492    { "v_pk_add_i16    v55, v79, v166 op_sel:[1,1] op_sel_hi:[0,1]\n",
     493        0xd3821837U, 0x10034d4fU, true, true, "" },
     494    { "v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[1,0,0]\n",
     495        0xd3804137U, 0x1f974d4fU, true, true, "" },
     496    { "v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[0,1,0]\n",
     497        0xd3804237U, 0x1f974d4fU, true, true, "" },
     498    { "v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[1,1,0]\n",
     499        0xd3804337U, 0x1f974d4fU, true, true, "" },
     500    { "v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[0,0,1]\n",
     501        0xd3804437U, 0x1f974d4fU, true, true, "" },
     502    { "v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[1,0,1]\n",
     503        0xd3804537U, 0x1f974d4fU, true, true, "" },
     504    { "v_pk_mad_i16    v55, v79, v166, v229 neg_hi:5\n",
     505        0xd3804537U, 0x1f974d4fU, true, true, "" },
     506    { "v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[0,1,1]\n",
     507        0xd3804637U, 0x1f974d4fU, true, true, "" },
     508    { "v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[1,1,1]\n",
     509        0xd3804737U, 0x1f974d4fU, true, true, "" },
     510    { "v_pk_add_i16    v55, v79, v166 neg_hi:[1,1]\n",
     511        0xd3824337U, 0x18034d4fU, true, true, "" },
     512    { "v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[1,0,0]\n",
     513        0xd3804037U, 0x3f974d4fU, true, true, "" },
     514    { "v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[0,1,0]\n",
     515        0xd3804037U, 0x5f974d4fU, true, true, "" },
     516    { "v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[1,1,0]\n",
     517        0xd3804037U, 0x7f974d4fU, true, true, "" },
     518    { "v_pk_mad_i16    v55, v79, v166, v229 neg_lo:3\n",
     519        0xd3804037U, 0x7f974d4fU, true, true, "" },
     520    { "v_pk_mad_i16    v55, -v79, -v166, v229\n",
     521        0xd3804037U, 0x7f974d4fU, true, true, "" },
     522    { "v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[0,0,1]\n",
     523        0xd3804037U, 0x9f974d4fU, true, true, "" },
     524    { "v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[1,0,1]\n",
     525        0xd3804037U, 0xbf974d4fU, true, true, "" },
     526    { "v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[0,1,1]\n",
     527        0xd3804037U, 0xdf974d4fU, true, true, "" },
     528    { "v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[1,1,1]\n",
     529        0xd3804037U, 0xff974d4fU, true, true, "" },
     530    { "v_pk_add_i16    v55, v79, v166 neg_lo:[1,1]\n",
     531        0xd3824037U, 0x78034d4fU, true, true, "" },
     532    { "v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[1,1,0] neg_hi:[1,0,1]\n",
     533        0xd3804537U, 0x7f974d4fU, true, true, "" },
     534    { "v_pk_mad_i16    v55, -v79, -v166, v229 clamp\n",
     535        0xd380c037U, 0x7f974d4fU, true, true, "" },
     536    /* VOP3P errors */
     537    { "v_pk_mad_i16    v55, -v79, -v166, v229 clamp mul:2\n", 0, 0, true, false,
     538        "test.s:1:46: Error: Unknown VOP modifier\n"
     539        "test.s:1:49: Error: Some garbages at VOP modifier place\n" },
     540    { "v_pk_mad_i16    v55, -v79, -v166, v229 clamp sext:2\n", 0, 0, true, false,
     541        "test.s:1:46: Error: Unknown VOP modifier\n"
     542        "test.s:1:50: Error: Some garbages at VOP modifier place\n" },
     543    { "v_pk_mad_i16    v55, -v79, -v166, v229 clamp abs:2\n", 0, 0, true, false,
     544        "test.s:1:46: Error: Unknown VOP modifier\n"
     545        "test.s:1:49: Error: Some garbages at VOP modifier place\n" },
     546    { "v_pk_mad_i16    v55, -v79, -abs(v166), v229 clamp\n", 0, 0, true, false,
     547        "test.s:1:32: Error: Expected operator\n"
     548        "test.s:1:33: Error: Expected ',' before argument\n" },
     549    { "v_pk_mad_i16    v55, -v79, sext(v166), v229 clamp\n", 0, 0, true, false,
     550        "test.s:1:32: Error: Expected operator\n"
     551        "test.s:1:33: Error: Expected ',' before argument\n" },
     552    /* VOP3P instructions */
     553    { "v_pk_mul_lo_u16 v55, v79, v166\n", 0xd3814037U, 0x18034d4fU, true, true, "" },
     554    { "v_pk_add_i16    v55, v79, v166\n", 0xd3824037U, 0x18034d4fU, true, true, "" },
     555    { "v_pk_sub_i16    v55, v79, v166\n", 0xd3834037U, 0x18034d4fU, true, true, "" },
     556    { "v_pk_lshlrev_b16 v55, v79, v166\n", 0xd3844037U, 0x18034d4fU, true, true, "" },
     557    { "v_pk_lshrrev_b16 v55, v79, v166\n", 0xd3854037U, 0x18034d4fU, true, true, "" },
     558    { "v_pk_ashrrev_i16 v55, v79, v166\n", 0xd3864037U, 0x18034d4fU, true, true, "" },
     559    { "v_pk_max_i16    v55, v79, v166\n", 0xd3874037U, 0x18034d4fU, true, true, "" },
     560    { "v_pk_min_i16    v55, v79, v166\n", 0xd3884037U, 0x18034d4fU, true, true, "" },
     561    { "v_pk_mad_u16    v55, v79, v166, v229\n", 0xd3894037U, 0x1f974d4fU, true, true, "" },
     562    { "v_pk_add_u16    v55, v79, v166\n", 0xd38a4037U, 0x18034d4fU, true, true, "" },
     563    { "v_pk_sub_u16    v55, v79, v166\n", 0xd38b4037U, 0x18034d4fU, true, true, "" },
     564    { "v_pk_max_u16    v55, v79, v166\n", 0xd38c4037U, 0x18034d4fU, true, true, "" },
     565    { "v_pk_min_u16    v55, v79, v166\n", 0xd38d4037U, 0x18034d4fU, true, true, "" },
     566    { "v_pk_fma_f16    v55, v79, v166, v229\n", 0xd38e4037U, 0x1f974d4fU, true, true, "" },
     567    { "v_pk_add_f16    v55, v79, v166\n", 0xd38f4037U, 0x18034d4fU, true, true, "" },
     568    { "v_pk_mul_f16    v55, v79, v166\n", 0xd3904037U, 0x18034d4fU, true, true, "" },
     569    { "v_pk_min_f16    v55, v79, v166\n", 0xd3914037U, 0x18034d4fU, true, true, "" },
     570    { "v_pk_max_f16    v55, v79, v166\n", 0xd3924037U, 0x18034d4fU, true, true, "" },
     571    { "v_mad_mix_f32   v55, v79, v166, v229\n", 0xd3a04037U, 0x1f974d4fU, true, true, "" },
     572    { "v_mad_mixlo_f16 v55, v79, v166, v229\n", 0xd3a14037U, 0x1f974d4fU, true, true, "" },
     573    { "v_mad_mixhi_f16 v55, v79, v166, v229\n", 0xd3a24037U, 0x1f974d4fU, true, true, "" },
     574    /* VINTRP */
     575    { "   v_interp_p1_f32 v93, v211, attr26.w", 0xd5746bd3U, 0, false, true, "" },
     576    { "   v_interp_p1_f32 v93, v211, attr26 . w", 0xd5746bd3U, 0, false, true, "" },
     577    { "   v_interp_p1_f32 v93, v211, aTTR26 . W", 0xd5746bd3U, 0, false, true, "" },
     578    { "   v_interp_p1_f32 v93, v211, aTTR00026 . W", 0xd5746bd3U, 0, false, true, "" },
     579    { "   v_interp_p1_f32 v93, v211, attr26.x", 0xd57468d3U, 0, false, true, "" },
     580    { "   v_interp_p1_f32 v93, v211, attr26.y", 0xd57469d3U, 0, false, true, "" },
     581    { "   v_interp_p1_f32 v93, v211, attr26.z", 0xd5746ad3U, 0, false, true, "" },
     582    { "   v_interp_p1_f32 v93, v211, attr63.z", 0xd574fed3U, 0, false, true, "" },
     583    { "   v_interp_p1_f32 v93  , v211  , attr63.z", 0xd574fed3U, 0, false, true, "" },
     584    { "   v_interp_p2_f32 v93, v211, attr26.w", 0xd5756bd3U, 0, false, true, "" },
     585    { "   v_interp_mov_f32 v93, p10, attr26.w", 0xd5766b00U, 0, false, true, "" },
     586    { "   v_interp_mov_f32 v93, p20, attr26.w", 0xd5766b01U, 0, false, true, "" },
     587    { "   v_interp_mov_f32 v93, p0, attr26.w", 0xd5766b02U, 0, false, true, "" },
    418588    { nullptr, 0, 0, false, false, 0 }
    419589};
Note: See TracChangeset for help on using the changeset viewer.