Changeset 4084 in CLRX


Ignore:
Timestamp:
May 5, 2018, 9:14:33 AM (4 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Simplify VOP2/VOP1/VOPC encoding part (use encodeVOPWords).

File:
1 edited

Legend:

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

    r4033 r4084  
    14531453}
    14541454
     1455static void encodeVOPWords(uint32_t vop0Word, cxbyte modifiers,
     1456        const VOPExtraModifiers& extraMods, const GCNOperand& src0Op,
     1457        const GCNOperand& src1Op, uint32_t immValue, uint16_t mode1,
     1458        // dstMod - (16bits lower value, 16bit - use dstMod instead std encoding
     1459        uint32_t inDstMod, cxuint& wordsNum, uint32_t* words)
     1460{
     1461    // VOP2 encoding
     1462    cxuint src0out = src0Op.range.bstart();
     1463    if (extraMods.needSDWA)
     1464        src0out = 0xf9;
     1465    else if (extraMods.needDPP)
     1466        src0out = 0xfa;
     1467    SLEV(words[0], vop0Word | uint32_t(src0out));
     1468    if (extraMods.needSDWA)
     1469    {
     1470        const uint32_t dstMod = (inDstMod & 0x10000) ? (inDstMod&0xff00) :
     1471                    ((uint32_t(extraMods.dstSel)<<8) |
     1472                    (uint32_t(extraMods.dstUnused)<<11) |
     1473                    ((modifiers & VOP3_CLAMP) ? 0x2000 : 0) |
     1474                    (uint32_t(modifiers & 3) << 14));
     1475        // if SDWA encoding
     1476        SLEV(words[wordsNum++], dstMod | (src0Op.range.bstart()&0xff) |
     1477                (uint32_t(extraMods.src0Sel)<<16) |
     1478                ((src0Op.vopMods&VOPOP_SEXT) ? (1U<<19) : 0) |
     1479                ((src0Op.vopMods&VOPOP_NEG) ? (1U<<20) : 0) |
     1480                ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) |
     1481                (uint32_t(extraMods.src1Sel)<<24) |
     1482                ((src1Op.vopMods&VOPOP_SEXT) ? (1U<<27) : 0) |
     1483                ((src1Op.vopMods&VOPOP_NEG) ? (1U<<28) : 0) |
     1484                ((src1Op.vopMods&VOPOP_ABS) ? (1U<<29) : 0) |
     1485                (src0Op.range.isNonVGPR() ? (1U<<23) : 0) |
     1486                (src1Op.range.isNonVGPR() ? (1U<<31) : 0));
     1487    }
     1488    else if (extraMods.needDPP)
     1489        // DPP encoding
     1490        SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) |
     1491                ((modifiers&VOP3_BOUNDCTRL) ? (1U<<19) : 0) |
     1492                ((src0Op.vopMods&VOPOP_NEG) ? (1U<<20) : 0) |
     1493                ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) |
     1494                ((src1Op.vopMods&VOPOP_NEG) ? (1U<<22) : 0) |
     1495                ((src1Op.vopMods&VOPOP_ABS) ? (1U<<23) : 0) |
     1496                (uint32_t(extraMods.bankMask)<<24) |
     1497                (uint32_t(extraMods.rowMask)<<28));
     1498    else if (src0Op.range.isVal(255)) // otherwise we check for immediate/literal value
     1499        SLEV(words[wordsNum++], src0Op.value);
     1500    else if (src1Op.range.isVal(255))
     1501        // literal from SRC1
     1502        SLEV(words[wordsNum++], src1Op.value);
     1503    else if (mode1 == GCN_ARG1_IMM || mode1 == GCN_ARG2_IMM)
     1504        SLEV(words[wordsNum++], immValue);
     1505}
     1506
    14551507bool GCNAsmUtils::parseVOP2Encoding(Assembler& asmr, const GCNAsmInstruction& gcnInsn,
    14561508                  const char* instrPlace, const char* linePtr, uint16_t arch,
     
    16761728    uint32_t words[2];
    16771729    if (!vop3)
    1678     {
    16791730        // VOP2 encoding
    1680         cxuint src0out = src0Op.range.bstart();
    1681         if (extraMods.needSDWA)
    1682             src0out = 0xf9;
    1683         else if (extraMods.needDPP)
    1684             src0out = 0xfa;
    1685         SLEV(words[0], (uint32_t(gcnInsn.code1)<<25) | src0out |
     1731        encodeVOPWords((uint32_t(gcnInsn.code1)<<25) |
    16861732                (uint32_t(src1Op.range.bstart()&0xff)<<9) |
    1687                 (uint32_t(dstReg.bstart()&0xff)<<17));
    1688         if (extraMods.needSDWA)
    1689             // if SDWA encoding
    1690             SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) |
    1691                     (uint32_t(extraMods.dstSel)<<8) |
    1692                     (uint32_t(extraMods.dstUnused)<<11) |
    1693                     ((modifiers & VOP3_CLAMP) ? 0x2000 : 0) |
    1694                     (uint32_t(extraMods.src0Sel)<<16) |
    1695                     ((src0Op.vopMods&VOPOP_SEXT) ? (1U<<19) : 0) |
    1696                     ((src0Op.vopMods&VOPOP_NEG) ? (1U<<20) : 0) |
    1697                     ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) |
    1698                     (uint32_t(extraMods.src1Sel)<<24) |
    1699                     ((src1Op.vopMods&VOPOP_SEXT) ? (1U<<27) : 0) |
    1700                     ((src1Op.vopMods&VOPOP_NEG) ? (1U<<28) : 0) |
    1701                     ((src1Op.vopMods&VOPOP_ABS) ? (1U<<29) : 0) |
    1702                     (src0Op.range.isNonVGPR() ? (1U<<23) : 0) |
    1703                     (src1Op.range.isNonVGPR() ? (1U<<31) : 0) |
    1704                     (uint32_t(modifiers & 3) << 14));
    1705         else if (extraMods.needDPP)
    1706             // DPP encoding
    1707             SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) |
    1708                     ((modifiers&VOP3_BOUNDCTRL) ? (1U<<19) : 0) |
    1709                     ((src0Op.vopMods&VOPOP_NEG) ? (1U<<20) : 0) |
    1710                     ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) |
    1711                     ((src1Op.vopMods&VOPOP_NEG) ? (1U<<22) : 0) |
    1712                     ((src1Op.vopMods&VOPOP_ABS) ? (1U<<23) : 0) |
    1713                     (uint32_t(extraMods.bankMask)<<24) |
    1714                     (uint32_t(extraMods.rowMask)<<28));
    1715         else if (src0Op.range.isVal(255)) // otherwise we check for immediate/literal value
    1716             SLEV(words[wordsNum++], src0Op.value);
    1717         else if (src1Op.range.isVal(255))
    1718             // literal from SRC1
    1719             SLEV(words[wordsNum++], src1Op.value);
    1720         else if (mode1 == GCN_ARG1_IMM || mode1 == GCN_ARG2_IMM)
    1721             SLEV(words[wordsNum++], immValue);
    1722     }
     1733                (uint32_t(dstReg.bstart()&0xff)<<17),
     1734                modifiers, extraMods, src0Op, src1Op, immValue, mode1,
     1735                0, wordsNum, words);
    17231736    else
    17241737    {
     
    18881901    uint32_t words[2];
    18891902    if (!vop3)
    1890     {
    18911903        // VOP1 encoding
    1892         cxuint src0out = src0Op.range.bstart();
    1893         if (extraMods.needSDWA)
    1894             src0out = 0xf9;
    1895         else if (extraMods.needDPP)
    1896             src0out = 0xfa;
    1897         SLEV(words[0], 0x7e000000U | (uint32_t(gcnInsn.code1)<<9) | uint32_t(src0out) |
    1898                 (uint32_t(dstReg.bstart()&0xff)<<17));
    1899         if (extraMods.needSDWA)
    1900             // SDWA encoding
    1901             SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) |
    1902                     (uint32_t(extraMods.dstSel)<<8) |
    1903                     (uint32_t(extraMods.dstUnused)<<11) |
    1904                     ((modifiers & VOP3_CLAMP) ? 0x2000 : 0) |
    1905                     (uint32_t(extraMods.src0Sel)<<16) |
    1906                     (uint32_t(extraMods.src1Sel)<<24) |
    1907                     ((src0Op.vopMods&VOPOP_SEXT) ? (1U<<19) : 0) |
    1908                     ((src0Op.vopMods&VOPOP_NEG) ? (1U<<20) : 0) |
    1909                     ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) |
    1910                     (src0Op.range.isNonVGPR() ? (1U<<23) : 0) |
    1911                     (uint32_t(modifiers & 3) << 14));
    1912         else if (extraMods.needDPP)
    1913             // DPP encoding
    1914             SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) |
    1915                     ((modifiers&VOP3_BOUNDCTRL) ? (1U<<19) : 0) |
    1916                     ((src0Op.vopMods&VOPOP_NEG) ? (1U<<20) : 0) |
    1917                     ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) |
    1918                     (uint32_t(extraMods.bankMask)<<24) |
    1919                     (uint32_t(extraMods.rowMask)<<28));
    1920         else if (src0Op.range.isVal(255))
    1921             SLEV(words[wordsNum++], src0Op.value);
    1922     }
     1904        encodeVOPWords(0x7e000000U | (uint32_t(gcnInsn.code1)<<9) |
     1905                (uint32_t(dstReg.bstart()&0xff)<<17),
     1906                modifiers, extraMods, src0Op, GCNOperand{ { 256, 257 } }, 0, mode1,
     1907                0, wordsNum, words);
    19231908    else
    19241909    {
     
    21022087    {
    21032088        // VOPC encoding
    2104         cxuint src0out = src0Op.range.bstart();
    2105         if (extraMods.needSDWA)
    2106             src0out = 0xf9;
    2107         else if (extraMods.needDPP)
    2108             src0out = 0xfa;
    2109         SLEV(words[0], 0x7c000000U | (uint32_t(gcnInsn.code1)<<17) | src0out |
    2110                 (uint32_t(src1Op.range.bstart()&0xff)<<9));
    2111         if (extraMods.needSDWA)
    2112         {
    2113             // SDWA encoding
    2114             const uint32_t dstMods = (!isGCN14) ? ((uint32_t(extraMods.dstSel)<<8) |
    2115                     (uint32_t(extraMods.dstUnused)<<11) |
    2116                     ((modifiers & VOP3_CLAMP) ? 0x2000 : 0) |
    2117                     (uint32_t(modifiers & 3) << 14)) : 0;
    2118             SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) |
    2119                     ((isGCN14 && !dstReg.isVal(106)) ? ((dstReg.bstart()|0x80)<<8) : 0) |
    2120                     (uint32_t(extraMods.src0Sel)<<16) |
    2121                     ((src0Op.vopMods&VOPOP_SEXT) ? (1U<<19) : 0) |
    2122                     ((src0Op.vopMods&VOPOP_NEG) ? (1U<<20) : 0) |
    2123                     ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) |
    2124                     (uint32_t(extraMods.src1Sel)<<24) |
    2125                     ((src1Op.vopMods&VOPOP_SEXT) ? (1U<<27) : 0) |
    2126                     ((src1Op.vopMods&VOPOP_NEG) ? (1U<<28) : 0) |
    2127                     ((src1Op.vopMods&VOPOP_ABS) ? (1U<<29) : 0) |
    2128                     (src0Op.range.isNonVGPR() ? (1U<<23) : 0) |
    2129                     (src1Op.range.isNonVGPR() ? (1U<<31) : 0) | dstMods);
    2130         }
    2131         else if (extraMods.needDPP)
    2132             // DPP encoding
    2133             SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) |
    2134                     ((modifiers&VOP3_BOUNDCTRL) ? (1U<<19) : 0) |
    2135                     ((src0Op.vopMods&VOPOP_NEG) ? (1U<<20) : 0) |
    2136                     ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) |
    2137                     ((src1Op.vopMods&VOPOP_NEG) ? (1U<<22) : 0) |
    2138                     ((src1Op.vopMods&VOPOP_ABS) ? (1U<<23) : 0) |
    2139                     (uint32_t(extraMods.bankMask)<<24) |
    2140                     (uint32_t(extraMods.rowMask)<<28));
    2141         else if (src0Op.range.isVal(255))
    2142             SLEV(words[wordsNum++], src0Op.value);
    2143         else if (src1Op.range.isVal(255))
    2144             SLEV(words[wordsNum++], src1Op.value);
     2089        const uint32_t dstMods = (isGCN14 ? 0x10000 : 0) |
     2090                ((isGCN14 && !dstReg.isVal(106)) ? ((dstReg.bstart()|0x80)<<8) : 0);
     2091       
     2092        encodeVOPWords(0x7c000000U | (uint32_t(gcnInsn.code1)<<17) |
     2093                (uint32_t(src1Op.range.bstart()&0xff)<<9),
     2094                modifiers, extraMods, src0Op, src1Op, 0, 0,
     2095                dstMods, wordsNum, words);
    21452096    }
    21462097    else
Note: See TracChangeset for help on using the changeset viewer.