Changeset 4810 in CLRX


Ignore:
Timestamp:
Jul 19, 2019, 6:07:41 PM (5 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add VOP DPP8 encoding and first testcase for it.

Location:
CLRadeonExtender/trunk
Files:
4 edited

Legend:

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

    r4809 r4810  
    12441244    else if (extraMods.needDPP)
    12451245        src0out = 0xfa;
     1246    else if (extraMods.needDPP8)
     1247        src0out = (extraMods.fi ? 0xea : 0xe9);
    12461248    SLEV(words[0], vop0Word | uint32_t(src0out));
    12471249    if (extraMods.needSDWA)
     
    12761278                (uint32_t(extraMods.bankMask)<<24) |
    12771279                (uint32_t(extraMods.rowMask)<<28));
     1280    else if (extraMods.needDPP8)
     1281        SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dpp8Value<<8));
    12781282    else if (src0Op.range.isVal(255)) // otherwise we check for immediate/literal value
    12791283        SLEV(words[wordsNum++], src0Op.value);
     
    15081512   
    15091513    bool sextFlags = ((src0Op.vopMods|src1Op.vopMods) & VOPOP_SEXT);
    1510     if (isGCN12 && (extraMods.needSDWA || extraMods.needDPP || sextFlags ||
    1511                 gcnVOPEnc!=GCNVOPEnc::NORMAL))
     1514    bool absNegFlags = ((src0Op.vopMods|src1Op.vopMods) & (VOPOP_ABS|VOPOP_NEG));
     1515    if (isGCN12 && (extraMods.needSDWA || extraMods.needDPP || extraMods.needDPP8 ||
     1516                sextFlags || gcnVOPEnc!=GCNVOPEnc::NORMAL))
    15121517    {
    15131518        /* if VOP_SDWA or VOP_DPP is required */
    15141519        if (!checkGCNVOPExtraModifers(asmr, arch, needImm, sextFlags, vop3,
    1515                     gcnVOPEnc, src0Op, extraMods, instrPlace))
     1520                    gcnVOPEnc, src0Op, extraMods, absNegFlags, instrPlace))
    15161521            return false;
    15171522        if (gcnAsm->instrRVUs[2].regField != ASMFIELD_NONE)
     
    16751680   
    16761681    bool sextFlags = (src0Op.vopMods & VOPOP_SEXT);
     1682    bool absNegFlags = (src0Op.vopMods & (VOPOP_ABS|VOPOP_NEG));
    16771683    bool needImm = (src0Op && src0Op.range.isVal(255));
    1678     if (isGCN12 && (extraMods.needSDWA || extraMods.needDPP || sextFlags ||
    1679                 gcnVOPEnc!=GCNVOPEnc::NORMAL))
     1684    if (isGCN12 && (extraMods.needSDWA || extraMods.needDPP || extraMods.needDPP8 ||
     1685                sextFlags || gcnVOPEnc!=GCNVOPEnc::NORMAL))
    16801686    {
    16811687        /* if VOP_SDWA or VOP_DPP is required */
    16821688        if (!checkGCNVOPExtraModifers(asmr, arch, needImm, sextFlags, vop3,
    1683                     gcnVOPEnc, src0Op, extraMods, instrPlace))
     1689                    gcnVOPEnc, src0Op, extraMods, absNegFlags, instrPlace))
    16841690            return false;
    16851691        if (gcnAsm->instrRVUs[1].regField != ASMFIELD_NONE)
     
    18431849   
    18441850    bool sextFlags = ((src0Op.vopMods|src1Op.vopMods) & VOPOP_SEXT);
    1845     if (isGCN12 && (extraMods.needSDWA || extraMods.needDPP || sextFlags ||
    1846                 gcnVOPEnc!=GCNVOPEnc::NORMAL))
     1851    bool absNegFlags = (src0Op.vopMods & (VOPOP_ABS|VOPOP_NEG));
     1852    if (isGCN12 && (extraMods.needSDWA || extraMods.needDPP || extraMods.needDPP8 ||
     1853                sextFlags || gcnVOPEnc!=GCNVOPEnc::NORMAL))
    18471854    {
    18481855        /* if VOP_SDWA or VOP_DPP is required */
    18491856        if (!checkGCNVOPExtraModifers(asmr, arch, needImm, sextFlags, vop3,
    1850                     gcnVOPEnc, src0Op, extraMods, instrPlace))
     1857                    gcnVOPEnc, src0Op, extraMods, absNegFlags, instrPlace))
    18511858            return false;
    18521859        if (gcnAsm->instrRVUs[1].regField != ASMFIELD_NONE)
  • CLRadeonExtender/trunk/amdasm/GCNAsmHelpers.cpp

    r4809 r4810  
    18761876    bool haveSext = false, haveOpsel = false;
    18771877    bool haveNegHi = false, haveOpselHi = false;
    1878     bool haveFi = false;
     1878    bool haveFi = false, haveDPP8 = false;
    18791879    bool haveDPP = false, haveSDWA = false;
    18801880   
     
    24782478                        extraMods->fi = fi;
    24792479                    }
     2480                    else if ((arch & ARCH_GCN_1_5)!=0 && ::strcmp(mod, "dpp8")==0)
     2481                    {
     2482                        skipSpacesToEnd(linePtr, end);
     2483                        if (linePtr!=end && *linePtr==':')
     2484                        {
     2485                            // parse dpp8 array
     2486                            bool goodMod = true;
     2487                            skipCharAndSpacesToEnd(linePtr, end);
     2488                            if (linePtr==end || *linePtr!='[')
     2489                            {
     2490                                ASM_NOTGOOD_BY_ERROR1(goodMod = good, linePtr,
     2491                                        "Expected '[' before dpp8 list")
     2492                                continue;
     2493                            }
     2494                            uint32_t dpp8 = 0;
     2495                            linePtr++;
     2496                            // parse four 3-bit values
     2497                            for (cxuint k = 0; k < 8; k++)
     2498                            {
     2499                                skipSpacesToEnd(linePtr, end);
     2500                                cxbyte qpv = 0;
     2501                                good &= parseImm(asmr, linePtr, qpv, nullptr,
     2502                                        3, WS_UNSIGNED);
     2503                                dpp8 |= qpv<<(k*3);
     2504                                skipSpacesToEnd(linePtr, end);
     2505                                if (k!=7)
     2506                                {
     2507                                    // skip ',' before next value
     2508                                    if (linePtr==end || *linePtr!=',')
     2509                                    {
     2510                                        ASM_NOTGOOD_BY_ERROR1(goodMod = good, linePtr,
     2511                                            "Expected ',' before dpp8 component")
     2512                                        break;
     2513                                    }
     2514                                    else
     2515                                        ++linePtr;
     2516                                }
     2517                                else if (linePtr==end || *linePtr!=']')
     2518                                {
     2519                                    // unterminated dpp8
     2520                                    asmr.printError(linePtr, "Unterminated dpp8");
     2521                                    goodMod = good = false;
     2522                                }
     2523                                else
     2524                                    ++linePtr;
     2525                            }
     2526                            if (goodMod)
     2527                            {
     2528                                // set up dpp8
     2529                                extraMods->dpp8Value = dpp8;
     2530                                if (haveDPP8)
     2531                                    asmr.printWarning(modPlace,
     2532                                              "DPP8 is already defined");
     2533                                haveDPP8 = true;
     2534                            }
     2535                        }
     2536                        else
     2537                            ASM_NOTGOOD_BY_ERROR(linePtr, "Expected ':' before quad_perm")
     2538                    }
    24802539                    else if (::strcmp(mod, "sdwa")==0)
    24812540                    {
     
    25152574        opMods.sextMod!=0 || haveSDWA);
    25162575    const bool vopDPP = (haveDppCtrl || haveBoundCtrl || haveBankMask || haveRowMask ||
    2517             haveDPP || haveFi);
     2576            haveDPP || (haveFi && !haveDPP8));
     2577    const bool vopDPP8 = (haveFi || haveDPP8);
    25182578    const bool isGCN14 = (arch & ARCH_GCN_1_4_5) != 0;
    25192579    // mul/div modifier does not apply to vop3 if RXVEGA (this case will be checked later)
     
    25242584        extraMods->needSDWA = vopSDWA;
    25252585        extraMods->needDPP = vopDPP;
    2526     }
    2527     if ((int(vop3)+vopSDWA+vopDPP)>1 ||
     2586        extraMods->needDPP8 = vopDPP8;
     2587    }
     2588    if ((int(vop3)+vopSDWA+vopDPP+vopDPP8)>1 ||
    25282589                // RXVEGA: mul/div modifier are accepted in VOP_SDWA but not for VOP_DPP
    2529                 (isGCN14 && (mods & 3)!=0 && vopDPP) ||
    2530                 ((mods&VOP3_CLAMP)!=0 && vopDPP))
     2590                (isGCN14 && (mods & 3)!=0 && (vopDPP||vopDPP8)) ||
     2591                ((mods&VOP3_CLAMP)!=0 && (vopDPP||vopDPP8)))
    25312592        ASM_FAIL_BY_ERROR(modsPlace, "Mixing modifiers from different encodings is illegal")
    25322593    return good;
     
    26752736            GCNVOPEnc vopEnc, GCNInsnMode insnMode, const VOPExtraModifiers* modifiers)
    26762737{
    2677     if (vopEnc==GCNVOPEnc::DPP && !modifiers->needDPP)
     2738    if (vopEnc==GCNVOPEnc::DPP && (!modifiers->needDPP && !modifiers->needDPP8))
    26782739        ASM_FAIL_BY_ERROR(insnPtr, "DPP encoding specified when DPP not present")
    26792740    if (vopEnc==GCNVOPEnc::SDWA && !modifiers->needSDWA)
    26802741        ASM_FAIL_BY_ERROR(insnPtr, "SDWA encoding specified when SDWA not present")
    2681     if (modifiers->needDPP && (insnMode&GCN_VOP_NODPP)!=0)
     2742    if ((modifiers->needDPP || modifiers->needDPP8) && (insnMode&GCN_VOP_NODPP)!=0)
    26822743        ASM_FAIL_BY_ERROR(insnPtr, "DPP encoding is illegal for this instruction")
    26832744    if (modifiers->needSDWA && (insnMode&GCN_VOP_NOSDWA)!=0)
     
    26902751bool GCNAsmUtils::checkGCNVOPExtraModifers(Assembler& asmr, GPUArchMask arch, bool needImm,
    26912752                 bool sextFlags, bool vop3, GCNVOPEnc gcnVOPEnc, const GCNOperand& src0Op,
    2692                  VOPExtraModifiers& extraMods, const char* instrPlace)
     2753                 VOPExtraModifiers& extraMods, bool absNegFlags, const char* instrPlace)
    26932754{
    26942755    if (needImm)
     
    26972758        ASM_FAIL_BY_ERROR(instrPlace, "SRC0 must be a vector register with "
    26982759                    "SDWA or DPP word")
    2699     if ((arch & ARCH_GCN_1_4_5)!=0 && extraMods.needDPP && !src0Op.range.isVGPR())
     2760    if ((arch & ARCH_GCN_1_4_5)!=0 && (extraMods.needDPP || extraMods.needDPP8) &&
     2761                    !src0Op.range.isVGPR())
    27002762        ASM_FAIL_BY_ERROR(instrPlace, "SRC0 must be a vector register with DPP word")
    27012763    if (vop3)
    27022764        // if VOP3 and (VOP_DPP or VOP_SDWA)
    27032765        ASM_FAIL_BY_ERROR(instrPlace, "Mixing VOP3 with SDWA or WORD is illegal")
    2704     if (sextFlags && extraMods.needDPP)
     2766    if (sextFlags && (extraMods.needDPP || extraMods.needDPP8))
    27052767        ASM_FAIL_BY_ERROR(instrPlace, "SEXT modifiers is unavailable for DPP word")
    2706     if (!extraMods.needSDWA && !extraMods.needDPP)
     2768    if (absNegFlags && extraMods.needDPP8)
     2769        ASM_FAIL_BY_ERROR(instrPlace, "ABS and NEG modifiers is unavailable for DPP8 word")
     2770    if (!extraMods.needSDWA && !extraMods.needDPP && !extraMods.needDPP8)
    27072771    {
    27082772        if (gcnVOPEnc!=GCNVOPEnc::DPP)
  • CLRadeonExtender/trunk/amdasm/GCNAsmInternals.h

    r4809 r4810  
    149149    bool needDPP;
    150150    bool fi; // DPP GFX10
     151    bool needDPP8;
     152    uint32_t dpp8Value;
    151153};
    152154
     
    311313                 bool needImm, bool sextFlags, bool vop3, GCNVOPEnc gcnVOPEnc,
    312314                 const GCNOperand& src0Op, VOPExtraModifiers& extraMods,
    313                  const char* instrPlace);
     315                 bool absNegFlags, const char* instrPlace);
    314316   
    315317    // routines to parse GCN encodings
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc15.cpp

    r4809 r4810  
    11231123    { "v_add_f32       v154, v190, v107 row_mirror bank_mask:0 row_mask:0 fi:0\n",
    11241124        0x0734d6faU, 0x140be, true, true, "" },
     1125    /* VOP DPP8 */
     1126    { "v_add_f32       v154, v190, v107 " "dpp8:[1,7,2,5,6,3,6,4]\n",
     1127        0x0734d6e9U, 0x99eab9be, true, true, "" },
    11251128    { nullptr, 0, 0, false, false, 0 }
    11261129};
Note: See TracChangeset for help on using the changeset viewer.