Changeset 4850 in CLRX


Ignore:
Timestamp:
Jul 26, 2019, 4:13:34 PM (5 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Stuff for MTBUF/MUBUF encoding for GFX10.

File:
1 edited

Legend:

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

    r4849 r4850  
    208208    cxuint dfmt = 1, nfmt = 0;
    209209    cxuint offset = 0;
     210    cxuint format = 0;
    210211    std::unique_ptr<AsmExpression> offsetExpr;
    211     bool haveAddr64 = false, haveTfe = false, haveSlc = false, haveLds = false;
     212    bool haveAddr64 = false, haveTfe = false, haveSlc = false;
     213    bool haveDlc = false, haveLds = false;
    212214    bool haveGlc = false, haveOffen = false, haveIdxen = false;
    213215    const char* modName = (gcnInsn.encoding==GCNENC_MTBUF) ?
     
    263265            skipCharAndSpacesToEnd(linePtr, end);
    264266           
     267            if (!isGCN15)
     268            { // pre NAVI
    265269            // parse [DATA_FORMAT:NUMBER_FORMAT]
    266270            if (linePtr==end || *linePtr!='[')
     
    344348                }
    345349            }
     350            // end for pre NAVI
     351            }
     352            else
     353            {
     354                // GFX10 and NAVI
     355                if (parseModImm(asmr, linePtr, format, nullptr, "format", 7, WS_UNSIGNED))
     356                {
     357                    if (haveFormat)
     358                        asmr.printWarning(modPlace, "Format is already defined");
     359                    haveFormat = true;
     360                }
     361                else
     362                    good = false;
     363            }
    346364        }
    347365        // other modifiers
     
    352370        else if (::strcmp(name, "glc")==0)
    353371            good &= parseModEnable(asmr, linePtr, haveGlc, "glc modifier");
     372        else if (isGCN15 && ::strcmp(name, "dlc")==0)
     373            good &= parseModEnable(asmr, linePtr, haveDlc, "dlc modifier");
    354374        else if (::strcmp(name, "slc")==0)
    355375            good &= parseModEnable(asmr, linePtr, haveSlc, "slc modifier");
     
    431451                (haveIdxen ? 0x2000U : 0U) | (haveGlc ? 0x4000U : 0U) |
    432452                ((haveAddr64 && !isGCN12) ? 0x8000U : 0U) | (haveLds ? 0x10000U : 0U) |
    433                 ((haveSlc && (isGCN12 && !isGCN15)) ? 0x20000U : 0) |
     453                ((haveSlc && isGCN12 && !isGCN15) ? 0x20000U : 0) |
     454                ((haveDlc && isGCN15) ? 0x8000U : 0) |
    434455                (uint32_t(gcnInsn.code1)<<18));
    435456    else
    436457    {
    437458        // MTBUF encoding
    438         uint32_t code = (isGCN12) ? (uint32_t(gcnInsn.code1)<<15) :
    439                 (uint32_t(gcnInsn.code1)<<16);
     459        uint32_t code = (isGCN12 && !isGCN15) ? (uint32_t(gcnInsn.code1)<<15) :
     460                (uint32_t(gcnInsn.code1&7)<<16);
    440461        SLEV(words[0], 0xe8000000U | offset | (haveOffen ? 0x1000U : 0U) |
    441462                (haveIdxen ? 0x2000U : 0U) | (haveGlc ? 0x4000U : 0U) |
    442463                ((haveAddr64 && !isGCN12) ? 0x8000U : 0U) | code |
     464                ((haveDlc && isGCN15) ? 0x8000U : 0) |
    443465                (uint32_t(dfmt)<<19) | (uint32_t(nfmt)<<23));
    444466    }
     
    447469            (uint32_t(srsrcReg.bstart()>>2)<<16) |
    448470            ((haveSlc && (!isGCN12 || isGCN15 ||
    449                         gcnInsn.encoding==GCNENC_MTBUF)) ? (1U<<22) : 0) |
    450             (haveTfe ? (1U<<23) : 0) | (uint32_t(soffsetOp.range.bstart())<<24));
     471                    gcnInsn.encoding==GCNENC_MTBUF)) ? (1U<<22) : 0) |
     472            (haveTfe ? (1U<<23) : 0) | (uint32_t(soffsetOp.range.bstart())<<24) |
     473            ((isGCN15 && gcnInsn.encoding==GCNENC_MTBUF &&
     474                        (gcnInsn.code1&8)!=0) ? (1U<<21) : 0));
    451475   
    452476    output.insert(output.end(), reinterpret_cast<cxbyte*>(words),
Note: See TracChangeset for help on using the changeset viewer.