Changeset 3081 in CLRX


Ignore:
Timestamp:
May 27, 2017, 2:06:22 PM (17 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: add new hwregisters, message types and extend waitcnt cnts.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3070 r3081  
    550550            sizeof(std::pair<const char*, uint16_t>);
    551551
     552static const std::pair<const char*, cxuint> hwregNamesGCN14Map[] =
     553{
     554    { "flush_ib", 14 },
     555    { "gpr_alloc", 5 },
     556    { "hw_id", 4 },
     557    { "ib_dbg0", 12 },
     558    { "ib_dbg1", 13 },
     559    { "ib_sts", 7 },
     560    { "inst_dw0", 10 },
     561    { "inst_dw1", 11 },
     562    { "lds_alloc", 6 },
     563    { "mode", 1 },
     564    { "pc_hi", 9 },
     565    { "pc_lo", 8 },
     566    { "sh_mem_bases", 15 },
     567    { "sq_shader_tba_hi", 17 },
     568    { "sq_shader_tba_lo", 16 },
     569    { "sq_shader_tma_hi", 19 },
     570    { "sq_shader_tma_lo", 18 },
     571    { "status", 2 },
     572    { "trapsts", 3 }
     573};
     574
     575static const size_t hwregNamesGCN14MapSize = sizeof(hwregNamesGCN14Map) /
     576            sizeof(std::pair<const char*, uint16_t>);
     577
    552578bool GCNAsmUtils::parseSOPKEncoding(Assembler& asmr, const GCNAsmInstruction& gcnInsn,
    553579                  const char* instrPlace, const char* linePtr, uint16_t arch,
     
    600626                asmr.sections[asmr.currentSection].addCodeFlowEntry({
    601627                    size_t(asmr.currentOutPos), size_t(value),
    602                     gcnInsn.code1==2 ? AsmCodeFlowType::JUMP : AsmCodeFlowType::CJUMP });
     628                    (arch&ARCH_RXVEGA && gcnInsn.code1==21) ? AsmCodeFlowType::CALL :
     629                            AsmCodeFlowType::CJUMP });
    603630        }
    604631    }
     
    621648        cxuint hwregId = 0;
    622649        const char* hwregNamePlace = linePtr;
     650        const size_t regMapSize = (arch & ARCH_RXVEGA) ?
     651                    hwregNamesGCN14MapSize : hwregNamesMapSize;
     652        const std::pair<const char*, cxuint>* regMap = (arch & ARCH_RXVEGA) ?
     653                    hwregNamesGCN14Map : hwregNamesMap;
    623654        good &= getEnumeration(asmr, linePtr, "HWRegister",
    624                       hwregNamesMapSize, hwregNamesMap, hwregId, "hwreg_");
     655                      regMapSize, regMap, hwregId, "hwreg_");
    625656        if (good && (arch & ARCH_GCN_1_2_4) == 0 && hwregId == 13)
    626657        {   // if ib_dgb1 in not GCN 1.2
     
    798829
    799830static const size_t sendMessageNamesMapSize = sizeof(sendMessageNamesMap) /
     831            sizeof(std::pair<const char*, uint16_t>);
     832
     833static const std::pair<const char*, uint16_t> sendMessageNamesGCN14Map[] =
     834{
     835    { "early_prim_dealloc", 8 },
     836    { "get_doorbell", 10 },
     837    { "gs", 2 },
     838    { "gs_alloc_req", 9 },
     839    { "gs_done", 3 },
     840    { "halt_waves", 6 },
     841    { "interrupt", 1 },
     842    { "ordered_ps_done", 7 },
     843    { "savewave", 4 },
     844    { "stall_wave_gen", 5 },
     845    { "sysmsg", 15 },
     846    { "system", 15 }
     847};
     848
     849static const size_t sendMessageNamesGCN14MapSize = sizeof(sendMessageNamesGCN14Map) /
    800850            sizeof(std::pair<const char*, uint16_t>);
    801851
     
    857907            bool haveExpCnt = false;
    858908            bool haveVMCnt = false;
    859             imm16 = 0xf7f;
     909            imm16 = (arch & ARCH_RXVEGA) ? 0xcf7f : 0xf7f;
    860910            while (true)
    861911            {
     
    868918                cxuint bitPos = 0, bitMask = UINT_MAX;
    869919                bool goodCnt = true;
     920                bool doVMCnt = false;
    870921                if (::strcmp(name, "vmcnt")==0)
    871922                {
     
    873924                        asmr.printWarning(funcNamePlace, "vmcnt was already defined");
    874925                    bitPos = 0;
    875                     bitMask = 15;
    876                     haveVMCnt = true;
     926                    bitMask = (arch & ARCH_RXVEGA) ? 63 : 15;
     927                    doVMCnt = haveVMCnt = true;
    877928                }
    878929                else if (::strcmp(name, "lgkmcnt")==0)
     
    912963                    if (value > bitMask)
    913964                        asmr.printWarning(argPlace, "Value out of range");
    914                     imm16 = (imm16 & ~(bitMask<<bitPos)) | ((value&bitMask)<<bitPos);
     965                    if ((arch & ARCH_RXVEGA)==0 || !doVMCnt)
     966                        imm16 = (imm16 & ~(bitMask<<bitPos)) | ((value&bitMask)<<bitPos);
     967                    else // vmcnt for GFX9
     968                        imm16 = (imm16 & 0x3ff0) | ((value&15) | ((value&0x30)<<10));
    915969                }
    916970                else
     
    933987        case GCN_IMM_MSGS:
    934988        {
    935             char name[20];
     989            char name[25];
    936990            const char* funcNamePlace = linePtr;
    937             if (!getNameArg(asmr, 20, name, linePtr, "function name", true))
     991            if (!getNameArg(asmr, 25, name, linePtr, "function name", true))
    938992                return false;
    939993            toLowerString(name);
     
    9481002            const char* funcArg1Place = linePtr;
    9491003            size_t sendMessage = 0;
    950             if (getNameArg(asmr, 20, name, linePtr, "message name", true))
     1004            if (getNameArg(asmr, 25, name, linePtr, "message name", true))
    9511005            {
    9521006                toLowerString(name);
    9531007                const size_t msgNameIndex = (::strncmp(name, "msg_", 4) == 0) ? 4 : 0;
    954                 size_t index = binaryMapFind(sendMessageNamesMap,
    955                          sendMessageNamesMap + sendMessageNamesMapSize,
    956                          name+msgNameIndex, CStringLess()) - sendMessageNamesMap;
    957                 if (index != sendMessageNamesMapSize &&
     1008                auto msgMap = (arch & ARCH_RXVEGA) ? sendMessageNamesGCN14Map :
     1009                        sendMessageNamesMap;
     1010                const size_t msgMapSize = (arch & ARCH_RXVEGA) ?
     1011                        sendMessageNamesGCN14MapSize : sendMessageNamesMapSize;
     1012                size_t index = binaryMapFind(msgMap, msgMap + msgMapSize,
     1013                         name+msgNameIndex, CStringLess()) - msgMap;
     1014                if (index != msgMapSize &&
    9581015                    // save_wave only for GCN1.2
    959                     (sendMessageNamesMap[index].second!=4 || (arch&ARCH_GCN_1_2_4)!=0))
    960                     sendMessage = sendMessageNamesMap[index].second;
     1016                    (msgMap[index].second!=4 || (arch&ARCH_GCN_1_2_4)!=0))
     1017                    sendMessage = msgMap[index].second;
    9611018                else
    9621019                {
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc14.cpp

    r3080 r3081  
    7676    /* SOPP instructions */
    7777    { "        s_endpgm_ordered_ps_done\n", 0xbf9e0000U, 0, false, true, "" },
     78    /* hwreg names */
     79    { "    s_getreg_b32    s43, hwreg(mode, 0, 1)", 0xb8ab0001U, 0, false, true, "" },
     80    { "    s_getreg_b32    s43, hwreg  (mode, 0, 1)", 0xb8ab0001U, 0, false, true, "" },
     81    { "    s_getreg_b32    s43, hwreg  (mode  ,   0  , 1  )",
     82                    0xb8ab0001U, 0, false, true, "" },
     83    { "    s_getreg_b32    s43, hwreg(HWREG_MODE, 0, 1)", 0xb8ab0001U, 0, false, true, "" },
     84    { "    s_getreg_b32    s43, hwreg(status, 0, 1)", 0xb8ab0002U, 0, false, true, "" },
     85    { "    s_getreg_b32    s43, hwreg(HWREG_STATUS, 0, 1)",
     86        0xb8ab0002U, 0, false, true, "" },
     87    { "    s_getreg_b32    s43, hwreg(trapsts, 0, 1)", 0xb8ab0003U, 0, false, true, "" },
     88    { "    s_getreg_b32    s43, hwreg(HWREG_TRAPSTS, 0, 1)",
     89                    0xb8ab0003U, 0, false, true, "" },
     90    { "    s_getreg_b32    s43, hwreg(hw_id, 0, 1)", 0xb8ab0004U, 0, false, true, "" },
     91    { "    s_getreg_b32    s43, hwreg(HWREG_HW_ID, 0, 1)",
     92                    0xb8ab0004U, 0, false, true, "" },
     93    { "    s_getreg_b32    s43, hwreg(gpr_alloc, 0, 1)", 0xb8ab0005U, 0, false, true, "" },
     94    { "    s_getreg_b32    s43, hwreg(HWREG_GPR_ALLOC, 0, 1)",
     95                    0xb8ab0005U, 0, false, true, "" },
     96    { "    s_getreg_b32    s43, hwreg(lds_alloc, 0, 1)", 0xb8ab0006U, 0, false, true, "" },
     97    { "    s_getreg_b32    s43, hwreg(HWREG_LDS_ALLOC, 0, 1)",
     98                    0xb8ab0006U, 0, false, true, "" },
     99    { "    s_getreg_b32    s43, hwreg(ib_sts, 0, 1)", 0xb8ab0007U, 0, false, true, "" },
     100    { "    s_getreg_b32    s43, hwreg(HWREG_IB_STS, 0, 1)",
     101                    0xb8ab0007U, 0, false, true, "" },
     102    { "    s_getreg_b32    s43, hwreg(pc_lo, 0, 1)", 0xb8ab0008U, 0, false, true, "" },
     103    { "    s_getreg_b32    s43, hwreg(HWREG_PC_LO, 0, 1)",
     104                    0xb8ab0008U, 0, false, true, "" },
     105    { "    s_getreg_b32    s43, hwreg(pc_hi, 0, 1)", 0xb8ab0009U, 0, false, true, "" },
     106    { "    s_getreg_b32    s43, hwreg(HWREG_PC_HI, 0, 1)",
     107                    0xb8ab0009U, 0, false, true, "" },
     108    { "    s_getreg_b32    s43, hwreg(inst_dw0, 0, 1)", 0xb8ab000aU, 0, false, true, "" },
     109    { "    s_getreg_b32    s43, hwreg(HWREG_INST_DW0, 0, 1)",
     110                    0xb8ab000aU, 0, false, true, "" },
     111    { "    s_getreg_b32    s43, hwreg(inst_dw1, 0, 1)", 0xb8ab000bU, 0, false, true, "" },
     112    { "    s_getreg_b32    s43, hwreg(HWREG_INST_DW1, 0, 1)",
     113                    0xb8ab000bU, 0, false, true, "" },
     114    { "    s_getreg_b32    s43, hwreg(ib_dbg0, 0, 1)", 0xb8ab000cU, 0, false, true, "" },
     115    { "    s_getreg_b32    s43, hwreg(HWREG_IB_DBG0, 0, 1)",
     116                    0xb8ab000cU, 0, false, true, "" },
     117    { "    s_getreg_b32    s43, hwreg(ib_dbg1, 0, 1)", 0xb8ab000dU, 0, false, true, "" },
     118    { "    s_getreg_b32    s43, hwreg(HWREG_IB_DBG1, 0, 1)",
     119                0xb8ab000dU, 0, false, true, "" },
     120    { "    s_getreg_b32    s43, hwreg(flush_ib, 0, 1)", 0xb8ab000eU, 0, false, true, "" },
     121    { "    s_getreg_b32    s43, hwreg(HWREG_FLUSH_IB, 0, 1)",
     122                0xb8ab000eU, 0, false, true, "" },
     123    { "    s_getreg_b32    s43, hwreg(sh_mem_bases, 0, 1)",
     124                0xb8ab000fU, 0, false, true, "" },
     125    { "    s_getreg_b32    s43, hwreg(HWREG_SH_MEM_BASES, 0, 1)",
     126                0xb8ab000fU, 0, false, true, "" },
     127    { "    s_getreg_b32    s43, hwreg(sq_shader_tba_lo, 0, 1)",
     128                0xb8ab0010U, 0, false, true, "" },
     129    { "    s_getreg_b32    s43, hwreg(HWREG_SQ_SHADER_TBA_LO, 0, 1)",
     130                0xb8ab0010U, 0, false, true, "" },
     131    { "    s_getreg_b32    s43, hwreg(sq_shader_tba_hi, 0, 1)",
     132                0xb8ab0011U, 0, false, true, "" },
     133    { "    s_getreg_b32    s43, hwreg(HWREG_SQ_SHADER_TBA_HI, 0, 1)",
     134                0xb8ab0011U, 0, false, true, "" },
     135    { "    s_getreg_b32    s43, hwreg(sq_shader_tma_lo, 0, 1)",
     136                0xb8ab0012U, 0, false, true, "" },
     137    { "    s_getreg_b32    s43, hwreg(HWREG_SQ_SHADER_TMA_LO, 0, 1)",
     138                0xb8ab0012U, 0, false, true, "" },
     139    { "    s_getreg_b32    s43, hwreg(sq_shader_tma_hi, 0, 1)",
     140                0xb8ab0013U, 0, false, true, "" },
     141    { "    s_getreg_b32    s43, hwreg(HWREG_SQ_SHADER_TMA_HI, 0, 1)",
     142                0xb8ab0013U, 0, false, true, "" },
     143    /* message types */
     144    { "    s_sendmsg  sendmsg(interrupt)", 0xbf900001U, 0, false, true, "" },
     145    { "    s_sendmsg  sendmsg(MSG_INTERRUPT)", 0xbf900001U, 0, false, true, "" },
     146    { "    s_sendmsg  sendmsg(system)", 0xbf90000fU, 0, false, true, "" },
     147    { "    s_sendmsg  sendmsg(MSG_SYSTEM)", 0xbf90000fU, 0, false, true, "" },
     148    { "    s_sendmsg  sendmsg(MSG_SYSMSG)", 0xbf90000fU, 0, false, true, "" },
     149    { "    s_sendmsg  sendmsg(gs, nop)", 0xbf900002U, 0, false, true, "" },
     150    { "    s_sendmsg  sendmsg(MSG_GS, GS_OP_NOP)", 0xbf900002U, 0, false, true, "" },
     151    { "    s_sendmsg  sendmsg(gs, cut, 0)", 0xbf900012U, 0, false, true, "" },
     152    { "    s_sendmsg  sendmsg(MSG_GS, GS_OP_CUT, 0)", 0xbf900012U, 0, false, true, "" },
     153    { "    s_sendmsg  sendmsg(gs, cut, 1)", 0xbf900112U, 0, false, true, "" },
     154    { "    s_sendmsg  sendmsg(MSG_GS, GS_OP_CUT, 1)", 0xbf900112U, 0, false, true, "" },
     155    { "    s_sendmsg  sendmsg(gs, emit, 0)", 0xbf900022U, 0, false, true, "" },
     156    { "    s_sendmsg  sendmsg(MSG_GS, GS_OP_EMIT, 0)", 0xbf900022U, 0, false, true, "" },
     157    { "    s_sendmsg  sendmsg(gs, emit_cut, 3)", 0xbf900332U, 0,
     158        false, true, "" },
     159    { "    s_sendmsg  sendmsg(gs, emit-cut, 3)", 0xbf900332U, 0,
     160        false, true, "" },
     161    { "    s_sendmsg  sendmsg ( gs    , emit_cut  , 3  )", 0xbf900332U, 0,
     162        false, true, "" },
     163    { "    s_sendmsg  sendmsg(MSG_GS, GS_OP_EMIT_CUT, 3)", 0xbf900332U, 0,
     164        false, true, "" },
     165    { "    s_sendmsg  sendmsg(gs_done, nop)", 0xbf900003U, 0, false, true, "" },
     166    { "    s_sendmsg  sendmsg(MSG_GS_DONE, GS_OP_NOP)", 0xbf900003U, 0, false, true, "" },
     167    { "    s_sendmsghalt  sendmsg(interrupt)", 0xbf910001U, 0, false, true, "" },
     168    { "    s_sendmsg  sendmsg(MSG_SAVEWAVE)",
     169        0xbf900004U, 0, false, true, "" },
     170    { "    s_sendmsg  sendmsg(savewave)", 0xbf900004U, 0, false, true, "" },
     171    { "    s_sendmsg  sendmsg(MSG_STALL_WAVE_GEN)", 0xbf900005U, 0, false, true, "" },
     172    { "    s_sendmsg  sendmsg(stall_wave_gen)", 0xbf900005U, 0, false, true, "" },
     173    { "    s_sendmsg  sendmsg(MSG_HALT_WAVES)", 0xbf900006U, 0, false, true, "" },
     174    { "    s_sendmsg  sendmsg(halt_waves)", 0xbf900006U, 0, false, true, "" },
     175    { "    s_sendmsg  sendmsg(MSG_ORDERED_PS_DONE)", 0xbf900007U, 0, false, true, "" },
     176    { "    s_sendmsg  sendmsg(ordered_ps_done)", 0xbf900007U, 0, false, true, "" },
     177    { "    s_sendmsg  sendmsg(MSG_EARLY_PRIM_DEALLOC)", 0xbf900008U, 0, false, true, "" },
     178    { "    s_sendmsg  sendmsg(early_prim_dealloc)", 0xbf900008U, 0, false, true, "" },
     179    { "    s_sendmsg  sendmsg(MSG_GS_ALLOC_REQ)", 0xbf900009U, 0, false, true, "" },
     180    { "    s_sendmsg  sendmsg(gs_alloc_req)", 0xbf900009U, 0, false, true, "" },
     181    { "    s_sendmsg  sendmsg(MSG_GET_DOORBELL)", 0xbf90000aU, 0, false, true, "" },
     182    { "    s_sendmsg  sendmsg(get_doorbell)", 0xbf90000aU, 0, false, true, "" },
     183    /* waitcnts */
     184    { "s_waitcnt       vmcnt(6) & expcnt(3) & lgkmcnt(13)\n",
     185        0xbf8c0d36U, 0, false, true, "" },
     186    { "s_waitcnt       vmcnt(22) & expcnt(3) & lgkmcnt(13)\n",
     187        0xbf8c4d36U, 0, false, true, "" },
     188    { "s_waitcnt       vmcnt(38) & expcnt(3) & lgkmcnt(13)\n",
     189        0xbf8c8d36U, 0, false, true, "" },
     190    { "s_waitcnt       vmcnt(54) & expcnt(3) & lgkmcnt(13)\n",
     191        0xbf8ccd36U, 0, false, true, "" },
     192    { "s_waitcnt       vmcnt(15) & expcnt(3) & lgkmcnt(13)\n",
     193        0xbf8c0d3fU, 0, false, true, "" },
     194    { "s_waitcnt       vmcnt(31) & expcnt(3) & lgkmcnt(13)\n",
     195        0xbf8c4d3fU, 0, false, true, "" },
     196    { "s_waitcnt       vmcnt(47) & expcnt(3) & lgkmcnt(13)\n",
     197        0xbf8c8d3fU, 0, false, true, "" },
     198    { "s_waitcnt       expcnt(3) & lgkmcnt(13)\n", 0xbf8ccd3fU, 0, false, true, "" },
     199    { "s_waitcnt       " "vmcnt(0) & expcnt(0) & lgkmcnt(0)\n",
     200        0xbf8c0000U, 0, false, true, "" },
    78201    { nullptr, 0, 0, false, false, 0 }
    79202};
Note: See TracChangeset for help on using the changeset viewer.