Changeset 3057 in CLRX


Ignore:
Timestamp:
May 12, 2017, 3:27:20 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNDisasm: First working stuff for GFX9.

Location:
CLRadeonExtender/trunk
Files:
1 added
5 edited

Legend:

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

    r3056 r3057  
    275275                disassembler.getDeviceType());
    276276    const bool isGCN11 = (arch == GPUArchitecture::GCN1_1);
    277     const bool isGCN12 = (arch == GPUArchitecture::GCN1_2);
     277    const bool isGCN12 = (arch >= GPUArchitecture::GCN1_2);
     278    const bool isGCN14 = (arch == GPUArchitecture::GCN1_4);
    278279    size_t pos;
    279280    for (pos = 0; pos < codeWordsNum; pos++)
     
    312313                        const cxuint opcode = (insnCode>>23)&0x1f;
    313314                        if ((!isGCN12 && opcode == 17) ||
    314                             (isGCN12 && opcode == 16)) // if branch fork
     315                            (isGCN12 && opcode == 16) || // if branch fork
     316                            (isGCN14 && opcode == 21)) // if s_call_b64
    315317                            labels.push_back(startOffset +
    316318                                    ((pos+int16_t(insnCode&0xffff)+1)<<2));
     
    567569{
    568570    const bool isGCN12 = ((arch&ARCH_GCN_1_2_4)!=0);
     571    const bool isGCN14 = ((arch&ARCH_RXVEGA)!=0);
    569572    const cxuint maxSgprsNum = getGPUMaxRegsNumByArchMask(arch, REGTYPE_SGPR);
    570573    if ((op < maxSgprsNum) || (op >= 256 && op < 512))
     
    582585   
    583586    const cxuint op2 = op&~1U;
    584     if (op2 == 106 || op2 == 108 || op2 == 110 || op2 == 126 ||
     587    if (op2 == 106 || (!isGCN14 && (op2 == 108 || op2 == 110)) || op2 == 126 ||
    585588        (op2 == 104 && (arch&ARCH_RX2X0)!=0) ||
    586589        ((op2 == 102 || op2 == 104) && isGCN12))
     
    645648    }
    646649   
    647     if (op >= 112 && op < 124)
     650    cxuint ttmpStart = (isGCN14 ? 108 : 112);
     651    if (op >= ttmpStart && op < 124)
    648652    {
    649653        putChars(bufPtr, "ttmp", 4);
    650         regRanges(op-112, regNum, bufPtr);
     654        regRanges(op-ttmpStart, regNum, bufPtr);
    651655        return;
    652656    }
     
    691695        return;
    692696    }
     697   
     698    if (isGCN14)
     699        switch(op)
     700        {
     701            case 0xeb:
     702                putChars(bufPtr, "shared_base", 11);
     703                return;
     704            case 0xec:
     705                putChars(bufPtr, "shared_limit", 12);
     706                return;
     707            case 0xed:
     708                putChars(bufPtr, "private_base", 12);
     709                return;
     710            case 0xee:
     711                putChars(bufPtr, "private_limit", 13);
     712                return;
     713            case 0xef:
     714                putChars(bufPtr, "pops_exiting_wave_id", 20);
     715                return;
     716        }
    693717   
    694718    switch(op)
     
    754778};
    755779
     780static const char* sendMsgCodeMessageTableVEGA[16] =
     781{
     782    "0",
     783    "interrupt",
     784    "gs",
     785    "gs_done",
     786    "savewave",
     787    "stall_wave_gen",
     788    "halt_waves",
     789    "ordered_ps_done",
     790    "early_prim_dealloc",
     791    "gs_alloc_req",
     792    "get_doorbell",
     793    "11", "12", "13", "14", "system"
     794};
     795
     796
    756797static const char* sendGsOpMessageTable[4] =
    757798{ "nop", "cut", "emit", "emit-cut" };
     
    803844         uint32_t literal, size_t pos)
    804845{
     846    const bool isGCN14 = ((arch&ARCH_RXVEGA)!=0);
    805847    FastOutputBuffer& output = dasm.output;
    806848    char* bufStart = output.reserve(60);
     
    821863            bool prevLock = false;
    822864            addSpaces(bufPtr, spacesToAdd);
    823             const bool isf7f = (imm16==0xf7f);
    824             if ((imm16&15) != 15 || isf7f)
     865            const bool isf7f = (!isGCN14 && imm16==0xf7f) ||
     866                    (isGCN14 && imm16==0xcf7f);
     867            if ((!isGCN14 && (imm16&15) != 15) ||
     868                (isGCN14 && (imm16&0xc00f) != 0xc00f) || isf7f)
    825869            {
    826                 const cxuint lockCnt = imm16&15;
     870                const cxuint lockCnt = isGCN14 ?
     871                        ((imm16>>10)&0x30) + (imm16&15) : imm16&15;
    827872                putChars(bufPtr, "vmcnt(", 6);
     873                const cxuint digit2 = lockCnt/10U;
    828874                if (lockCnt >= 10)
    829                     *bufPtr++ = '1';
    830                 *bufPtr++ = '0' + ((lockCnt>=10)?lockCnt-10:lockCnt);
     875                    *bufPtr++ = '0'+digit2;
     876                *bufPtr++= '0' + lockCnt-digit2*10U;
    831877                *bufPtr++ = ')';
    832878                prevLock = true;
     
    862908                prevLock = true;
    863909            }
    864             if ((imm16&0xf080) != 0)
     910            if ((!isGCN14 && (imm16&0xf080) != 0) || (isGCN14 && (imm16&0x3080) != 0))
    865911            {   /* additional info about imm16 */
    866912                if (prevLock)
     
    879925            putChars(bufPtr, "sendmsg(", 8);
    880926            const cxuint msgType = imm16&15;
    881             const char* msgName = sendMsgCodeMessageTable[msgType];
    882             cxuint minUnknownMsgType = 4;
    883             if ((arch & ARCH_GCN_1_2_4) != 0 && msgType == 4)
     927            const char* msgName = (isGCN14 ? sendMsgCodeMessageTableVEGA[msgType] :
     928                    sendMsgCodeMessageTable[msgType]);
     929            cxuint minUnknownMsgType = isGCN14 ? 11 : 4;
     930            if ((arch & ARCH_RX3X0) != 0 && msgType == 4)
    884931            {
    885                 msgName = "savewave"; // 4 - save_wave
     932                msgName = "savewave"; // 4 - savewave
    886933                minUnknownMsgType = 5;
    887934            }
     
    10041051}
    10051052
    1006 static const char* hwregNames[14] =
     1053static const char* hwregNames[20] =
    10071054{
    10081055    "0", "mode", "status", "trapsts",
    10091056    "hw_id", "gpr_alloc", "lds_alloc", "ib_sts",
    10101057    "pc_lo", "pc_hi", "inst_dw0", "inst_dw1",
    1011     "ib_dbg0", "ib_dbg1"
     1058    "ib_dbg0", "ib_dbg1", "flush_ib", "sh_mem_bases",
     1059    "sq_shader_tba_lo", "sq_shader_tba_hi",
     1060    "sq_shader_tma_lo", "sq_shader_tma_hi"
    10121061};
    10131062
     
    10421091        const cxuint hwregId = imm16&0x3f;
    10431092        cxuint hwregNamesNum = 13 + ((arch&ARCH_GCN_1_2_4)!=0);
     1093        if ((arch&ARCH_RXVEGA) != 0)
     1094            hwregNamesNum = 20;
    10441095        if (hwregId < hwregNamesNum)
    10451096            putChars(bufPtr, hwregNames[hwregId], ::strlen(hwregNames[hwregId]));
     
    24532504                disassembler.getDeviceType());
    24542505    const bool isGCN11 = (arch == GPUArchitecture::GCN1_1);
    2455     const bool isGCN12 = (arch == GPUArchitecture::GCN1_2);
     2506    const bool isGCN124 = (arch >= GPUArchitecture::GCN1_2);
    24562507    const uint16_t curArchMask =
    24572508            1U<<int(getGPUArchitectureFromDeviceType(disassembler.getDeviceType()));
     
    25282579                        gcnEncoding = GCNENC_SOPK;
    25292580                        const uint32_t opcode = ((insnCode>>23)&0x1f);
    2530                         if ((!isGCN12 && opcode == 21) ||
    2531                             (isGCN12 && opcode == 20))
     2581                        if ((!isGCN124 && opcode == 21) ||
     2582                            (isGCN124 && opcode == 20))
    25322583                        {
    25332584                            if (pos < codeWordsNum)
     
    25492600            {   // SMRD and others
    25502601                const uint32_t encPart = (insnCode&0x3c000000U)>>26;
    2551                 if ((!isGCN12 && gcnSize11Table[encPart] && (encPart != 7 || isGCN11)) ||
    2552                     (isGCN12 && gcnSize12Table[encPart]))
     2602                if ((!isGCN124 && gcnSize11Table[encPart] && (encPart != 7 || isGCN11)) ||
     2603                    (isGCN124 && gcnSize12Table[encPart]))
    25532604                {
    25542605                    if (pos < codeWordsNum)
    25552606                        insnCode2 = ULEV(codeWords[pos++]);
    25562607                }
    2557                 if (isGCN12)
     2608                if (isGCN124)
    25582609                    gcnEncoding = gcnEncoding12Table[encPart];
    25592610                else
    25602611                    gcnEncoding = gcnEncoding11Table[encPart];
    2561                 if (gcnEncoding == GCNENC_FLAT && !isGCN11 && !isGCN12)
     2612                if (gcnEncoding == GCNENC_FLAT && !isGCN11 && !isGCN124)
    25622613                    gcnEncoding = GCNENC_NONE; // illegal if not GCN1.1
    25632614            }
     
    25692620                if ((insnCode&0x1ff) == 0xff || // literal
    25702621                    // SDWA, DDP
    2571                     (isGCN12 && ((insnCode&0x1ff) == 0xf9 || (insnCode&0x1ff) == 0xfa)))
     2622                    (isGCN124 && ((insnCode&0x1ff) == 0xf9 || (insnCode&0x1ff) == 0xfa)))
    25722623                {
    25732624                    if (pos < codeWordsNum)
     
    25802631                if ((insnCode&0x1ff) == 0xff || // literal
    25812632                    // SDWA, DDP
    2582                     (isGCN12 && ((insnCode&0x1ff) == 0xf9 || (insnCode&0x1ff) == 0xfa)))
     2633                    (isGCN124 && ((insnCode&0x1ff) == 0xf9 || (insnCode&0x1ff) == 0xfa)))
    25832634                {
    25842635                    if (pos < codeWordsNum)
     
    25902641            {   // VOP2
    25912642                const cxuint opcode = (insnCode >> 25)&0x3f;
    2592                 if ((!isGCN12 && (opcode == 32 || opcode == 33)) ||
    2593                     (isGCN12 && (opcode == 23 || opcode == 24 ||
     2643                if ((!isGCN124 && (opcode == 32 || opcode == 33)) ||
     2644                    (isGCN124 && (opcode == 23 || opcode == 24 ||
    25942645                    opcode == 36 || opcode == 37))) // V_MADMK and V_MADAK
    25952646                {
     
    25992650                else if ((insnCode&0x1ff) == 0xff || // literal
    26002651                    // SDWA, DDP
    2601                     (isGCN12 && ((insnCode&0x1ff) == 0xf9 || (insnCode&0x1ff) == 0xfa)))
     2652                    (isGCN124 && ((insnCode&0x1ff) == 0xf9 || (insnCode&0x1ff) == 0xfa)))
    26022653                {
    26032654                    if (pos < codeWordsNum)
     
    26482699        {
    26492700            const GCNEncodingOpcodeBits* encodingOpcodeTable =
    2650                     (isGCN12) ? gcnEncodingOpcode12Table : gcnEncodingOpcodeTable;
     2701                    (isGCN124) ? gcnEncodingOpcode12Table : gcnEncodingOpcodeTable;
    26512702            const cxuint opcode =
    26522703                    (insnCode>>encodingOpcodeTable[gcnEncoding].bitPos) &
     
    26552706            /* decode instruction and put to output */
    26562707            const GCNEncodingSpace& encSpace =
    2657                 (isGCN12) ? gcnInstrTableByCodeSpaces[GCNENC_MAXVAL+3 + gcnEncoding] :
     2708                (isGCN124) ? gcnInstrTableByCodeSpaces[GCNENC_MAXVAL+3 + gcnEncoding] :
    26582709                  gcnInstrTableByCodeSpaces[gcnEncoding];
    26592710            const GCNInstruction* gcnInsn = gcnInstrTableByCode.get() +
     
    26642715            cxuint spacesToAdd = 16;
    26652716            bool isIllegal = false;
    2666             if (!isGCN12 && gcnInsn->mnemonic != nullptr &&
     2717            if (!isGCN124 && gcnInsn->mnemonic != nullptr &&
    26672718                (curArchMask & gcnInsn->archMask) == 0 &&
    26682719                gcnEncoding == GCNENC_VOP3A)
     
    26892740                char* bufStart = output.reserve(40);
    26902741                char* bufPtr = bufStart;
    2691                 if (!isGCN12 || gcnEncoding != GCNENC_SMEM)
     2742                if (!isGCN124 || gcnEncoding != GCNENC_SMEM)
    26922743                    putChars(bufPtr, gcnEncodingNames[gcnEncoding],
    26932744                            ::strlen(gcnEncodingNames[gcnEncoding]));
     
    27312782                    break;
    27322783                case GCNENC_SMRD:
    2733                     if (isGCN12)
     2784                    if (isGCN124)
    27342785                        GCNDisasmUtils::decodeSMEMEncoding(*this, spacesToAdd, curArchMask,
    27352786                                  *gcnInsn, insnCode, insnCode2);
  • CLRadeonExtender/trunk/amdasm/GCNInstructions.cpp

    r3056 r3057  
    256256    { "s_andn1_wrexec_b64",  GCNENC_SOP1,   GCN_REG_ALL_64,           53,   ARCH_RXVEGA  },
    257257    { "s_andn2_wrexec_b64",  GCNENC_SOP1,   GCN_REG_ALL_64,           54,   ARCH_RXVEGA  },
    258     { "s_bitreplicate_b64_b32",  GCNENC_SOP1,   GCN_REG_DS0_64,           55,   ARCH_RXVEGA  },
     258    { "s_bitreplicate_b64_b32",  GCNENC_SOP1,   GCN_REG_DST_64,           55,   ARCH_RXVEGA  },
    259259    { "s_cmp_eq_i32",        GCNENC_SOPC,   GCN_STDMODE,              0,    ARCH_GCN_ALL  },
    260260    { "s_cmp_lg_i32",        GCNENC_SOPC,   GCN_STDMODE,              1,    ARCH_GCN_ALL  },
  • CLRadeonExtender/trunk/tests/amdasm/CMakeLists.txt

    r3023 r3057  
    2323        GCNDisasmOpcodes.cpp
    2424        GCNDisasmOpc11.cpp
    25         GCNDisasmOpc12.cpp)
     25        GCNDisasmOpc12.cpp
     26        GCNDisasmOpc14.cpp)
    2627TEST_LINK_LIBRARIES(GCNDisasmOpcodes CLRXAmdAsm CLRXAmdBin CLRXUtils)
    2728ADD_TEST(GCNDisasmOpcodes GCNDisasmOpcodes)
  • CLRadeonExtender/trunk/tests/amdasm/GCNDisasmOpc.h

    r2682 r3057  
    3333extern const GCNDisasmOpcodeCase decGCNOpcodeGCN11Cases[];
    3434extern const GCNDisasmOpcodeCase decGCNOpcodeGCN12Cases[];
     35extern const GCNDisasmOpcodeCase decGCNOpcodeGCN14Cases[];
    3536
    3637#endif
  • CLRadeonExtender/trunk/tests/amdasm/GCNDisasmOpcodes.cpp

    r2682 r3057  
    8181            retVal = 1;
    8282        }
     83    for (cxuint i = 0; decGCNOpcodeGCN14Cases[i].expected!=nullptr; i++)
     84        try
     85        { testDecGCNOpcodes(i, decGCNOpcodeGCN14Cases[i], GPUDeviceType::GFX900); }
     86        catch(const std::exception& ex)
     87        {
     88            std::cerr << ex.what() << std::endl;
     89            retVal = 1;
     90        }
    8391    return retVal;
    8492}
Note: See TracChangeset for help on using the changeset viewer.