Changeset 3105 in CLRX
- Timestamp:
- May 30, 2017, 5:45:57 PM (21 months ago)
- Location:
- CLRadeonExtender/trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
CLRadeonExtender/trunk/amdasm/GCNAsmHelpers.cpp
r3104 r3105 1001 1001 instrOpMask & ~INSTROP_VOP3MODS, regField); 1002 1002 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 && 1004 1005 linePtr+4 <= end && toLower(linePtr[0])=='s' && 1005 1006 toLower(linePtr[1])=='e' && toLower(linePtr[2])=='x' && … … 1027 1028 } 1028 1029 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' && 1030 1032 toLower(linePtr[1])=='b' && toLower(linePtr[2])=='s') 1031 1033 { … … 1581 1583 bool GCNAsmUtils::parseVOPModifiers(Assembler& asmr, const char*& linePtr, 1582 1584 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) 1585 1586 { 1586 1587 const char* end = asmr.line+asmr.lineSize; … … 1592 1593 bool haveNeg = false, haveAbs = false; 1593 1594 bool haveSext = false, haveOpsel = false; 1595 bool haveNegHi = false, haveOpselHi = false; 1594 1596 1595 1597 if (extraMods!=nullptr) … … 1602 1604 bool good = true; 1603 1605 mods = 0; 1606 const bool vop3p = (flags & PARSEVOP_VOP3P)!=0; 1604 1607 while (linePtr != end) 1605 1608 { … … 1615 1618 { 1616 1619 bool alreadyModDefined = false; 1617 if ( ::strcmp(mod, "mul")==0)1620 if (!vop3p && ::strcmp(mod, "mul")==0) 1618 1621 { 1619 1622 skipSpacesToEnd(linePtr, end); … … 1644 1647 } 1645 1648 } 1646 else if ( ::strcmp(mod, "div")==0)1649 else if (!vop3p && ::strcmp(mod, "div")==0) 1647 1650 { 1648 1651 skipSpacesToEnd(linePtr, end); … … 1668 1671 } 1669 1672 } 1670 else if ( ::strcmp(mod, "omod")==0)1673 else if (!vop3p && ::strcmp(mod, "omod")==0) 1671 1674 { 1672 1675 skipSpacesToEnd(linePtr, end); … … 1690 1693 bool clamp = false; 1691 1694 good &= parseModEnable(asmr, linePtr, clamp, "clamp modifier"); 1692 if ( withClamp)1695 if (flags & PARSEVOP_WITHCLAMP) 1693 1696 mods = (mods & ~VOP3_CLAMP) | (clamp ? VOP3_CLAMP : 0); 1694 1697 else … … 1698 1701 } 1699 1702 } 1700 else if ( modOperands>1 && ::strcmp(mod, "abs")==0)1703 else if (!vop3p && modOperands>1 && ::strcmp(mod, "abs")==0) 1701 1704 { 1702 1705 uint32_t absVal = 0; … … 1716 1719 good = false; 1717 1720 } 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))) 1719 1723 { 1720 1724 uint32_t negVal = 0; … … 1725 1729 WS_UNSIGNED)) 1726 1730 { 1727 opMods.negMod = negVal;1731 opMods.negMod = (opMods.negMod&0xf0) | negVal; 1728 1732 if (haveNeg) 1729 1733 asmr.printWarning(modPlace, "Neg is already defined"); … … 1734 1738 good = false; 1735 1739 } 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 && 1737 1760 modOperands>1 && ::strcmp(mod, "sext")==0) 1738 1761 { … … 1753 1776 good = false; 1754 1777 } 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) 1756 1780 { 1757 1781 uint32_t opselVal = 0; … … 1759 1783 { 1760 1784 linePtr++; 1761 if (parseImmWithBoolArray(asmr, linePtr, opselVal, modOperands, 1785 if (parseImmWithBoolArray(asmr, linePtr, opselVal, 1786 (vop3p ? modOperands-1 : modOperands), 1762 1787 WS_UNSIGNED)) 1763 1788 { 1764 opMods.opselMod = opselVal;1789 opMods.opselMod = (opMods.opselMod&0xf0) | opselVal; 1765 1790 if (haveOpsel) 1766 1791 asmr.printWarning(modPlace, "Opsel is already defined"); 1767 1792 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; 1768 1812 } 1769 1813 } -
CLRadeonExtender/trunk/amdasm/GCNAsmInternals.h
r3104 r3105 59 59 INSTROP_ACCESS_MASK = 0x30000, 60 60 INSTROP_NOSEXT = 0x40000, 61 INSTROP_VOP3P = 0x80000, // VOP3P encoding 61 62 62 63 // for parseSRregRange/parseVRegRange … … 129 130 130 131 struct CLRX_INTERNAL VOPExtraModifiers 131 { // TODO: check that for MSVC 2015132 { 132 133 cxbyte dstSel; 133 134 cxbyte dstUnused; … … 144 145 { 145 146 cxbyte absMod; 146 cxbyte negMod; 147 cxbyte negMod; // lo (low 4-bits) and hi (high 4-bits) 147 148 cxbyte sextMod; 148 cxbyte opselMod; 149 cxbyte opselMod; // lo (low 4-bits) and hi (high 4-bits) 149 150 }; 150 151 … … 161 162 DPP, 162 163 SDWA 164 }; 165 166 enum { 167 PARSEVOP_WITHCLAMP = 1, 168 PARSEVOP_WITHSEXT = 2, 169 PARSEVOP_WITHOPSEL = 4, 170 PARSEVOP_VOP3P = 8 163 171 }; 164 172 … … 217 225 static bool parseVOPModifiers(Assembler& asmr, const char*& linePtr, uint16_t arch, 218 226 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); 222 230 223 231 static bool parseOperand(Assembler& asmr, const char*& linePtr, GCNOperand& operand, -
CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp
r3104 r3105 1522 1522 VOPOpModifiers opMods{}; 1523 1523 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); 1525 1526 if (!good || !checkGarbagesAtEnd(asmr, linePtr)) 1526 1527 return false; … … 1668 1669 (src0Op.range.isNonVGPR() ? (1U<<23) : 0) | 1669 1670 (src1Op.range.isNonVGPR() ? (1U<<31) : 0) | 1670 ( (modifiers & 3) << 14));1671 (uint32_t(modifiers & 3) << 14)); 1671 1672 else if (extraMods.needDPP) 1672 1673 SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) | … … 1698 1699 ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0)); 1699 1700 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) | 1701 1702 ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0) | 1702 1703 ((src1Op.vopMods & VOPOP_NEG) ? (1U<<30) : 0)); … … 1781 1782 VOPOpModifiers opMods{}; 1782 1783 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); 1785 1786 if (!good || !checkGarbagesAtEnd(asmr, linePtr)) 1786 1787 return false; … … 1863 1864 ((src0Op.vopMods&VOPOP_ABS) ? (1U<<21) : 0) | 1864 1865 (src0Op.range.isNonVGPR() ? (1U<<23) : 0) | 1865 ( (modifiers & 3) << 14));1866 (uint32_t(modifiers & 3) << 14)); 1866 1867 else if (extraMods.needDPP) 1867 1868 SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) | … … 1881 1882 SLEV(words[0], 0xd0000000U | code | (dstReg.bstart()&0xff) | 1882 1883 ((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) | 1884 1885 ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0)); 1885 1886 wordsNum++; … … 1954 1955 VOPOpModifiers opMods{}; 1955 1956 good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods, 3, 1956 (isGCN12)?&extraMods:nullptr, true);1957 (isGCN12)?&extraMods:nullptr, PARSEVOP_WITHCLAMP|PARSEVOP_WITHSEXT); 1957 1958 if (!good || !checkGarbagesAtEnd(asmr, linePtr)) 1958 1959 return false; … … 2066 2067 (src0Op.range.isNonVGPR() ? (1U<<23) : 0) | 2067 2068 (src1Op.range.isNonVGPR() ? (1U<<31) : 0) | 2068 ( (modifiers & 3) << 14));2069 (uint32_t(modifiers & 3) << 14)); 2069 2070 else if (extraMods.needDPP) 2070 2071 SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) | … … 2090 2091 ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0)); 2091 2092 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) | 2093 2095 ((src1Op.vopMods & VOPOP_NEG) ? (1U<<30) : 0)); 2094 2096 wordsNum++; … … 2124 2126 const bool isGCN12 = (arch & ARCH_GCN_1_2_4)!=0; 2125 2127 const bool isGCN14 = (arch & ARCH_RXVEGA)!=0; 2128 const bool vop3p = (gcnInsn.mode & GCN_VOP3_VOP3P) != 0; 2126 2129 if (gcnVOPEnc!=GCNVOPEnc::NORMAL) 2127 2130 { … … 2140 2143 bool modHigh = false; 2141 2144 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) }; 2146 2151 cxuint operands = 1; 2147 2152 if (mode1 != GCN_VOP_ARG_NONE) … … 2293 2298 if (mode2 != GCN_VOP3_VINTRP) 2294 2299 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); 2297 2304 if (!good || !checkGarbagesAtEnd(asmr, linePtr)) 2298 2305 return false; … … 2367 2374 SLEV(words[0], 0xd0000000U | (uint32_t(gcnInsn.code1)<<16) | 2368 2375 (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) | 2372 2381 ((opMods.opselMod&15) << 11)); 2373 2382 else // VINTRP … … 2382 2391 if (wordsNum==2) 2383 2392 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 */ 2385 2397 ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0) | 2386 2398 ((src1Op.vopMods & VOPOP_NEG) ? (1U<<30) : 0) | -
CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc12.cpp
r3098 r3105 680 680 { " v_mov_b32 v158, sext(abs(v79))", 0x7f3c02f9U, 0x2e064fU, true, true, "" }, 681 681 { " 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, "" }, 682 684 { " v_mov_b32 v158, v79 dst_sel:w1 src0_sel:b2 dst_un:preserve", 683 685 0x7f3c02f9U, 0x02154fU, true, true, "" }, -
CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc14.cpp
r3104 r3105 416 416 { "v_alignbit_b32 v55, v79, v166, v229 op_sel:0xb\n", 417 417 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, "" }, 418 588 { nullptr, 0, 0, false, false, 0 } 419 589 };
Note: See TracChangeset
for help on using the changeset viewer.