Changeset 4867 in CLRX


Ignore:
Timestamp:
Jul 28, 2019, 5:34:02 PM (5 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Preparing FLAT encoding for GFX10.

File:
1 edited

Legend:

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

    r4862 r4867  
    998998        ASM_FAIL_BY_ERROR(instrPlace, "Only 64-bit size for FLAT encoding")
    999999    const bool isGCN14 = (arch & ARCH_GCN_1_4)!=0;
     1000    const bool isGCN15 = ((arch&ARCH_GCN_1_5)!=0);
    10001001    const cxuint flatMode = (gcnInsn.mode & GCN_FLAT_MODEMASK);
    10011002    bool good = true;
     
    11251126   
    11261127    if (saddrOff)
    1127         saddrReg.start = 0x7f;
     1128        saddrReg.start = isGCN15 ? 0x7d : 0x7f;
    11281129    if (vaddrOff)
    11291130        vaddrReg.start = 0x00;
     
    11331134    bool haveTfe = false, haveSlc = false, haveGlc = false;
    11341135    bool haveNv = false, haveLds = false, haveInstOffset = false;
     1136    bool haveDlc = false;
    11351137   
    11361138    // main loop to parsing FLAT modifiers
     
    11491151        }
    11501152        // only GCN1.2 modifiers
    1151         if (!isGCN14 && ::strcmp(name, "tfe") == 0)
     1153        if (!isGCN14 && !isGCN15 && ::strcmp(name, "tfe") == 0)
    11521154            good &= parseModEnable(asmr, linePtr, haveTfe, "tfe modifier");
    11531155        // only GCN1.4 modifiers
     
    11591161        else if (::strcmp(name, "glc") == 0)
    11601162            good &= parseModEnable(asmr, linePtr, haveGlc, "glc modifier");
     1163        else if (isGCN15 && ::strcmp(name, "dlc") == 0)
     1164            good &= parseModEnable(asmr, linePtr, haveDlc, "dlc modifier");
    11611165        else if (::strcmp(name, "slc") == 0)
    11621166            good &= parseModEnable(asmr, linePtr, haveSlc, "slc modifier");
    1163         else if (isGCN14 && (::strcmp(name, "inst_offset")==0 ||
     1167        else if ((isGCN14 || isGCN15) && (::strcmp(name, "inst_offset")==0 ||
    11641168                            ::strcmp(name, "offset")==0))
    11651169        {
    11661170            // parse inst_offset, 13-bit with sign, or 12-bit unsigned
     1171            cxbyte bits = flatMode!=0 ? 13 : 12;
     1172            cxbyte wssign = flatMode!=0 ? WS_BOTH : WS_UNSIGNED;
     1173            if (isGCN15)
     1174            {
     1175                bits = 11;
     1176                wssign = WS_UNSIGNED;
     1177            }
    11671178            if (parseModImm(asmr, linePtr, instOffset, &instOffsetExpr, "inst_offset",
    1168                             flatMode!=0 ? 13 : 12, flatMode!=0 ? WS_BOTH : WS_UNSIGNED))
     1179                            bits, wssign))
    11691180            {
    11701181                if (haveInstOffset)
     
    12511262    SLEV(words[0], 0xdc000000U | (haveGlc ? 0x10000 : 0) | (haveSlc ? 0x20000: 0) |
    12521263            (uint32_t(gcnInsn.code1)<<18) | (haveLds ? 0x2000U : 0) | instOffset |
    1253             (uint32_t(flatMode)<<14));
     1264            (uint32_t(haveDlc)<<12) | (uint32_t(flatMode)<<14));
    12541265    SLEV(words[1], (vaddrReg.bstart()&0xff) | (uint32_t(vdataReg.bstart()&0xff)<<8) |
    12551266            (haveTfe|haveNv ? (1U<<23) : 0) | (uint32_t(vdstReg.bstart()&0xff)<<24) |
Note: See TracChangeset for help on using the changeset viewer.