Changeset 3093 in CLRX


Ignore:
Timestamp:
May 28, 2017, 5:46:35 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add parametrization to modifiers (dst_sel, dst_unused, src0_sel, src1_sel) in SDWA encoding.
CLRXDocs: Small fix.

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r3089 r3093  
    16641664                            linePtr++;
    16651665                            cxuint dstSel = 0;
    1666                             if (getEnumeration(asmr, linePtr, "dst_sel",
    1667                                         vopSDWADSTSelNamesNum,
    1668                                         vopSDWADSTSelNamesMap, dstSel))
     1666                            if (linePtr == end || *linePtr!='@')
    16691667                            {
    1670                                 extraMods->dstSel = dstSel;
    1671                                 if (haveDstSel)
    1672                                     asmr.printWarning(modPlace,
    1673                                               "Dst_sel is already defined");
    1674                                 haveDstSel = true;
     1668                                if (getEnumeration(asmr, linePtr, "dst_sel",
     1669                                            vopSDWADSTSelNamesNum,
     1670                                            vopSDWADSTSelNamesMap, dstSel))
     1671                                {
     1672                                    extraMods->dstSel = dstSel;
     1673                                    if (haveDstSel)
     1674                                        asmr.printWarning(modPlace,
     1675                                                "Dst_sel is already defined");
     1676                                    haveDstSel = true;
     1677                                }
     1678                                else
     1679                                    good = false;
    16751680                            }
    16761681                            else
    1677                                 good = false;
     1682                            {   /* parametrize */
     1683                                linePtr++;
     1684                                if (parseImm(asmr, linePtr, dstSel, nullptr,
     1685                                                 3, WS_UNSIGNED))
     1686                                {
     1687                                    extraMods->dstSel = dstSel;
     1688                                    if (haveDstSel)
     1689                                        asmr.printWarning(modPlace,
     1690                                                "Dst_sel is already defined");
     1691                                    haveDstSel = true;
     1692                                }
     1693                                else
     1694                                    good = false;
     1695                            }
    16781696                        }
    16791697                        else
     
    16901708                        {
    16911709                            skipCharAndSpacesToEnd(linePtr, end);
    1692                             char name[20];
    1693                             const char* enumPlace = linePtr;
    1694                             if (getNameArg(asmr, 20, name, linePtr, "dst_unused"))
     1710                            cxbyte unused = 0;
     1711                            if (linePtr == end || *linePtr!='@')
    16951712                            {
    1696                                 toLowerString(name);
    1697                                 size_t namePos = (::strncmp(name, "unused_", 7)==0) ? 7 : 0;
    1698                                 cxbyte unused = 0;
    1699                                 if (::strcmp(name+namePos, "sext")==0)
    1700                                     unused = 1;
    1701                                 else if (::strcmp(name+namePos, "preserve")==0)
    1702                                     unused = 2;
    1703                                 else if (::strcmp(name+namePos, "pad")!=0)
     1713                                char name[20];
     1714                                const char* enumPlace = linePtr;
     1715                                if (getNameArg(asmr, 20, name, linePtr, "dst_unused"))
    17041716                                {
    1705                                     asmr.printError(enumPlace, "Unknown dst_unused");
     1717                                    toLowerString(name);
     1718                                    size_t namePos =
     1719                                            (::strncmp(name, "unused_", 7)==0) ?7 : 0;
     1720                                    if (::strcmp(name+namePos, "sext")==0)
     1721                                        unused = 1;
     1722                                    else if (::strcmp(name+namePos, "preserve")==0)
     1723                                        unused = 2;
     1724                                    else if (::strcmp(name+namePos, "pad")!=0)
     1725                                    {
     1726                                        asmr.printError(enumPlace, "Unknown dst_unused");
     1727                                        good = false;
     1728                                    }
     1729                                    extraMods->dstUnused = unused;
     1730                                    if (haveDstUnused)
     1731                                        asmr.printWarning(modPlace,
     1732                                                        "Dst_unused is already defined");
     1733                                    haveDstUnused = true;
     1734                                }
     1735                                else
    17061736                                    good = false;
    1707                                 }
    1708                                 extraMods->dstUnused = unused;
    1709                                 if (haveDstUnused)
    1710                                     asmr.printWarning(modPlace,
    1711                                                       "Dst_unused is already defined");
    1712                                 haveDstUnused = true;
    17131737                            }
    17141738                            else
    1715                                 good = false;
     1739                            {
     1740                                linePtr++;
     1741                                if (parseImm(asmr, linePtr, unused, nullptr,
     1742                                                 2, WS_UNSIGNED))
     1743                                {
     1744                                    extraMods->dstUnused = unused;
     1745                                    if (haveDstUnused)
     1746                                        asmr.printWarning(modPlace,
     1747                                                        "Dst_unused is already defined");
     1748                                    haveDstUnused = true;
     1749                                }
     1750                                else
     1751                                    good = false;
     1752                            }
    17161753                        }
    17171754                        else
     
    17281765                            linePtr++;
    17291766                            cxuint src0Sel = 0;
    1730                             if (getEnumeration(asmr, linePtr, "src0_sel",
    1731                                         vopSDWADSTSelNamesNum,
    1732                                         vopSDWADSTSelNamesMap, src0Sel))
     1767                            if (linePtr == end || *linePtr!='@')
    17331768                            {
    1734                                 extraMods->src0Sel = src0Sel;
    1735                                 if (haveSrc0Sel)
    1736                                     asmr.printWarning(modPlace,
    1737                                                       "Src0_sel is already defined");
    1738                                 haveSrc0Sel = true;
     1769                                if (getEnumeration(asmr, linePtr, "src0_sel",
     1770                                            vopSDWADSTSelNamesNum,
     1771                                            vopSDWADSTSelNamesMap, src0Sel))
     1772                                {
     1773                                    extraMods->src0Sel = src0Sel;
     1774                                    if (haveSrc0Sel)
     1775                                        asmr.printWarning(modPlace,
     1776                                                        "Src0_sel is already defined");
     1777                                    haveSrc0Sel = true;
     1778                                }
     1779                                else
     1780                                    good = false;
    17391781                            }
    17401782                            else
    1741                                 good = false;
     1783                            {   /* parametrize */
     1784                                linePtr++;
     1785                                if (parseImm(asmr, linePtr, src0Sel, nullptr,
     1786                                                 3, WS_UNSIGNED))
     1787                                {
     1788                                    extraMods->src0Sel = src0Sel;
     1789                                    if (haveSrc0Sel)
     1790                                        asmr.printWarning(modPlace,
     1791                                                        "Src0_sel is already defined");
     1792                                    haveSrc0Sel = true;
     1793                                }
     1794                                else
     1795                                    good = false;
     1796                            }
    17421797                        }
    17431798                        else
     
    17541809                            linePtr++;
    17551810                            cxuint src1Sel = 0;
    1756                             if (getEnumeration(asmr, linePtr, "src1_sel",
    1757                                         vopSDWADSTSelNamesNum,
    1758                                         vopSDWADSTSelNamesMap, src1Sel))
     1811                            if (linePtr == end || *linePtr!='@')
    17591812                            {
    1760                                 extraMods->src1Sel = src1Sel;
    1761                                 if (haveSrc1Sel)
    1762                                     asmr.printWarning(modPlace,
    1763                                                       "Src1_sel is already defined");
    1764                                 haveSrc1Sel = true;
     1813                                if (getEnumeration(asmr, linePtr, "src1_sel",
     1814                                            vopSDWADSTSelNamesNum,
     1815                                            vopSDWADSTSelNamesMap, src1Sel))
     1816                                {
     1817                                    extraMods->src1Sel = src1Sel;
     1818                                    if (haveSrc1Sel)
     1819                                        asmr.printWarning(modPlace,
     1820                                                        "Src1_sel is already defined");
     1821                                    haveSrc1Sel = true;
     1822                                }
     1823                                else
     1824                                    good = false;
    17651825                            }
    17661826                            else
    1767                                 good = false;
     1827                            {   /* parametrize */
     1828                                linePtr++;
     1829                                if (parseImm(asmr, linePtr, src1Sel, nullptr,
     1830                                                 3, WS_UNSIGNED))
     1831                                {
     1832                                    extraMods->src1Sel = src1Sel;
     1833                                    if (haveSrc1Sel)
     1834                                        asmr.printWarning(modPlace,
     1835                                                        "Src1_sel is already defined");
     1836                                    haveSrc1Sel = true;
     1837                                }
     1838                                else
     1839                                    good = false;
     1840                            }
    17681841                        }
    17691842                        else
  • CLRadeonExtender/trunk/doc/GcnOperands.md

    r3091 r3093  
    167167
    168168The HW registers and send message parameters (message and GSOP) is parametrizable if
    169 they will be preceded by `@` (example: `hwreg(@5)`).
     169they will be preceded by `@` (example: `hwreg(@5, 8, 16)`).
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc12.cpp

    r3092 r3093  
    300300    { "   v_cndmask_b32   v154, v65, v107, vcc dst_sel:b2 src0_sel:byte2 src1_sel:byte_2",
    301301        0x0134d6f9U, 0x02020241U, true, true, "" },
     302    { "   v_cndmask_b32   v154, v65, v107, vcc dst_sel:@2 src0_sel:@2 src1_sel:@2",
     303        0x0134d6f9U, 0x02020241U, true, true, "" },
    302304    { "   v_cndmask_b32   v154, v65, v107, vcc dst_sel:b3 src0_sel:byte3 src1_sel:byte_3",
    303305        0x0134d6f9U, 0x03030341U, true, true, "" },
     
    308310    { "   v_cndmask_b32   v154, v65, v107, vcc dst_sel:w1 src0_sel:word0 src1_sel:dword",
    309311        0x0134d6f9U, 0x06040541U, true, true, "" },
     312    { "   v_cndmask_b32   v154, v65, v107, vcc dst_sel:@5 src0_sel:@4 src1_sel:@6",
     313        0x0134d6f9U, 0x06040541U, true, true, "" },
    310314    { "   v_cndmask_b32   v154, v65, v107, vcc dst_un:preserve",
    311315        0x0134d6f9U, 0x06061641U, true, true, "" },
     
    313317        0x0134d6f9U, 0x06061641U, true, true, "" },
    314318    { "   v_cndmask_b32   v154, v65, v107, vcc dst_unused : SEXT",
     319        0x0134d6f9U, 0x06060e41U, true, true, "" },
     320    { "   v_cndmask_b32   v154, v65, v107, vcc dst_unused : @1",
    315321        0x0134d6f9U, 0x06060e41U, true, true, "" },
    316322    { "   v_cndmask_b32   v154, v65, v107, vcc dst_unused:pad",
Note: See TracChangeset for help on using the changeset viewer.