Changeset 4855 in CLRX


Ignore:
Timestamp:
Jul 27, 2019, 8:41:40 PM (5 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: First stuff to handle MIMG for GFX10.

File:
1 edited

Legend:

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

    r4854 r4855  
    487487}
    488488
     489// dim values names
     490static const std::pair<const char*, cxuint> mimgDimNamesMap[] =
     491{
     492    { "1d", 0 },
     493    { "1d_array", 4 },
     494    { "2d", 1 },
     495    { "2d_array", 5 },
     496    { "2d_msaa", 6 },
     497    { "2d_msaa_array", 7 },
     498    { "3d", 2 },
     499    { "cube", 3 },
     500};
     501
    489502bool GCNAsmUtils::parseMIMGEncoding(Assembler& asmr, const GCNAsmInstruction& gcnInsn,
    490503                  const char* instrPlace, const char* linePtr, GPUArchMask arch,
     
    495508    if (gcnEncSize==GCNEncSize::BIT32)
    496509        ASM_FAIL_BY_ERROR(instrPlace, "Only 64-bit size for MIMG encoding")
     510    const bool isGCN12 = (arch & ARCH_GCN_1_2_4)!=0;
    497511    const bool isGCN14 = (arch & ARCH_GCN_1_4)!=0;
     512    const bool isGCN15 = (arch & ARCH_GCN_1_5)!=0;
    498513    bool good = true;
    499514    RegRange vaddrReg(0, 0);
     
    551566    bool haveDa = false, haveR128 = false, haveLwe = false, haveUnorm = false;
    552567    bool haveDMask = false, haveD16 = false, haveA16 = false;
     568    bool haveDlc = false, haveDim = false;
     569    cxbyte dimVal = 0;
    553570    cxbyte dmask = 0x1;
    554571    /* modifiers and modifiers */
     
    572589                // DA modifier
    573590                good &= parseModEnable(asmr, linePtr, haveDa, "da modifier");
    574             else if ((arch & ARCH_GCN_1_2_4)!=0 && name[1]=='1' &&
    575                 name[2]=='6' && name[3]==0)
     591            else if (isGCN15 && name[1]=='l' && name[2]=='c' && name[3]==0)
     592                good &= parseModEnable(asmr, linePtr, haveDlc, "dlc modifier");
     593            else if (isGCN15 && name[1]=='i' && name[2]=='m' && name[3]==0)
     594            {
     595                // parse dim
     596                // parse dmask
     597                skipSpacesToEnd(linePtr, end);
     598                if (linePtr!=end && *linePtr==':')
     599                {
     600                    skipCharAndSpacesToEnd(linePtr, end);
     601                    const char* dimPlace = linePtr;
     602                    char dimName[30];
     603                    if (linePtr != end && *linePtr=='@')
     604                    {
     605                        // expression, parse DATA_FORMAT
     606                        linePtr++;
     607                        if (!parseImm(asmr, linePtr, dimVal, nullptr, 3, WS_UNSIGNED))
     608                            good = false;
     609                    }
     610                    else if (getMUBUFFmtNameArg(
     611                                asmr, 30, dimName, linePtr, "MIMG dimension"))
     612                    {
     613                        toLowerString(dimName);
     614                        size_t nfmtNameIndex = (::strncmp(dimName,
     615                                 "sq_rsrc_img_", 12)==0) ? 12 : 0;
     616                        size_t dimIdx = binaryMapFind(mimgDimNamesMap,
     617                               mimgDimNamesMap+8, dimName+nfmtNameIndex,
     618                               CStringLess())-mimgDimNamesMap;
     619                        // check if found
     620                        if (dimIdx!=8)
     621                        {
     622                            dimVal = dimIdx;
     623                            if (haveDim)
     624                                asmr.printWarning(modPlace, "Dim is already defined");
     625                            haveDim = true;
     626                        }
     627                        else
     628                            ASM_NOTGOOD_BY_ERROR1(good, dimPlace, "Unknown MIMG dimension")
     629                    }
     630                }
     631            }
     632            else if ((isGCN12 || isGCN15) && name[1]=='1' && name[2]=='6' && name[3]==0)
    576633                // D16 modifier
    577634                good &= parseModEnable(asmr, linePtr, haveD16, "d16 modifier");
     
    638695        dregsNum = ((dmask & 1)?1:0) + ((dmask & 2)?1:0) + ((dmask & 4)?1:0) +
    639696                ((dmask & 8)?1:0);
    640         if (isGCN14 && haveD16)
     697        if ((isGCN14 || isGCN15) && haveD16)
    641698            dregsNum = (dregsNum+1)>>1;
    642699        dregsNum += (haveTfe);
     
    657714        return false;
    658715   
     716    if (isGCN15 && !haveDim)
     717        ASM_FAIL_BY_ERROR(instrPlace, "MIMG instruction for GFX10 requires DIM modifier")
     718   
    659719    /* checking modifiers conditions */
    660720    if (!haveUnorm && ((gcnInsn.mode&GCN_MLOAD) == 0 || (gcnInsn.mode&GCN_MATOMIC)!=0))
     
    678738    SLEV(words[0], 0xf0000000U | (uint32_t(dmask&0xf)<<8) | (haveUnorm ? 0x1000U : 0) |
    679739        (haveGlc ? 0x2000U : 0) | (haveDa ? 0x4000U : 0) |
    680         (haveR128|haveA16 ? 0x8000U : 0) |
     740        (haveR128|haveA16 ? 0x8000U : 0) | (haveDlc ? 0x80U : 0) |
    681741        (haveTfe ? 0x10000U : 0) | (haveLwe ? 0x20000U : 0) |
    682742        (uint32_t(gcnInsn.code1)<<18) | (haveSlc ? (1U<<25) : 0));
Note: See TracChangeset for help on using the changeset viewer.