Changeset 4801 in CLRX


Ignore:
Timestamp:
Jul 17, 2019, 8:22:16 PM (5 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add SMEM encoding testcases for GFX10. Fixes for SMEM encoding for GFX10. Add DLC for SMEM (GFX10).

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r4800 r4801  
    10221022    const GCNInsnMode mode1 = (gcnInsn.mode & GCN_MASK1);
    10231023    const bool isGCN14 = (arch & ARCH_GCN_1_4) != 0;
     1024    const bool isGCN15 = (arch & ARCH_GCN_1_5) != 0;
    10241025   
    10251026    const char* soffsetPlace = nullptr;
     
    10871088    bool haveNv = false;
    10881089    bool haveOffset = false;
     1090    bool haveDlc = false;
    10891091    // parse modifiers
    10901092    while (linePtr != end)
     
    11001102            if (::strcmp(name, "glc")==0)
    11011103                good &= parseModEnable(asmr, linePtr, haveGlc, "glc modifier");
    1102             else if (isGCN14 && ::strcmp(name, "nv")==0)
     1104            else if (::strcmp(name, "dlc")==0)
     1105                good &= parseModEnable(asmr, linePtr, haveDlc, "dlc modifier");
     1106            else if ((isGCN14 || isGCN15) && ::strcmp(name, "nv")==0)
    11031107                good &= parseModEnable(asmr, linePtr, haveNv, "nv modifier");
    11041108            else if (isGCN14 && ::strcmp(name, "offset")==0)
     
    11821186    // put data (2 instruction words)
    11831187    uint32_t words[2];
    1184     SLEV(words[0], 0xc0000000U | (uint32_t(gcnInsn.code1)<<18) | (dataReg.bstart()<<6) |
     1188    const uint32_t encoding = isGCN15 ? 0xf4000000U : 0xc0000000U;
     1189    const uint32_t soffsetRegNull = isGCN15 ? 0x7d : 0;
     1190    SLEV(words[0], encoding | (uint32_t(gcnInsn.code1)<<18) | (dataReg.bstart()<<6) |
    11851191            (sbaseReg.bstart()>>1) |
    11861192            // enable IMM if soffset is immediate or haveOffset with SGPR
    1187             ((soffsetReg.isVal(255) || haveOffset) ? 0x20000 : 0) |
    1188             (haveGlc ? 0x10000 : 0) | (haveNv ? 0x8000 : 0) | (haveOffset ? 0x4000 : 0));
    1189     SLEV(words[1], (
     1193            ((!isGCN15 && (soffsetReg.isVal(255) || haveOffset)) ? 0x20000 : 0) |
     1194            (haveGlc ? 0x10000 : 0) | (haveNv ? 0x8000 : 0) |
     1195            (((!isGCN15 && haveOffset) || (isGCN15 && haveDlc)) ? 0x4000 : 0));
     1196    SLEV(words[1],
    11901197            // store IMM OFFSET if offset: or IMM offset instead SGPR
    1191             ((soffsetReg.isVal(255) || haveOffset) ? soffsetVal : soffsetReg.bstart())) |
     1198            ((isGCN15 || soffsetReg.isVal(255) || haveOffset) ?
     1199                                soffsetVal : soffsetReg.bstart()) |
    11921200            // store SGPR in SOFFSET if have offset and have SGPR offset
    1193                 ((haveOffset && !soffsetReg.isVal(255)) ? (soffsetReg.bstart()<<25) : 0));
     1201                (((isGCN15 && !soffsetReg.isVal(255)) ||
     1202                        (!isGCN15 && haveOffset && !soffsetReg.isVal(255))) ?
     1203                        (soffsetReg.bstart()<<25) : (soffsetRegNull<<25)));
    11941204   
    11951205    output.insert(output.end(), reinterpret_cast<cxbyte*>(words),
  • CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp

    r4730 r4801  
    265265            break;
    266266        case GCNENC_SMRD:
    267             if (curArchMask & ARCH_GCN_1_2_4)
     267            if (curArchMask & ARCH_GCN_1_2_4_5)
    268268                good = GCNAsmUtils::parseSMEMEncoding(assembler, *it, mnemPlace, linePtr,
    269269                               curArchMask, output, regs, gcnEncSize);
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc15.cpp

    r4800 r4801  
    537537    { "        s_denorm_mode   0x1234\n", 0xbfa51234U, 0, false, true, "" },
    538538    { "        s_ttracedata_imm 0x1234\n", 0xbfa81234U, 0, false, true, "" },
     539    /* SMEM encoding */
     540    { "    s_load_dword    s3, s[0:1], s4\n", 0xf40000c0U, 0x08000000U, true, true, "" },
     541    { "        s_load_dword    s3, s[0:1], 0x6ba23\n",
     542                0xf40000c0U, 0xfa06ba23U, true, true, "" },
     543    { "        s_load_dword    s3, s[18:19], s4\n",
     544                0xf40000c9U, 0x08000000U, true, true, "" },
     545    { "        s_load_dword    s3, s[18:19], 0x6ba23\n",
     546                0xf40000c9U, 0xfa06ba23U, true, true, "" },
     547    { "        s_load_dword    s3, s[0:1], s4 glc dlc\n",
     548                0xf40140c0U, 0x08000000U, true, true, "" },
     549    { "        s_load_dword    s3, s[0:1], s4 dlc\n",
     550                0xf40040c0U, 0x08000000U, true, true, "" },
     551    { "        s_load_dword    s3, s[0:1], s4 nv\n",
     552                0xf40080c0U, 0x08000000U, true, true, "" },
    539553    { nullptr, 0, 0, false, false, 0 }
    540554};
Note: See TracChangeset for help on using the changeset viewer.