Changeset 4989 in CLRX


Ignore:
Timestamp:
Sep 23, 2019, 11:39:04 AM (3 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: KCode: Correct handling switching and checking codeFlags between kcode regions.

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r4973 r4989  
    220220            {
    221221                // pop from kcode stack and apply changes
    222                 AsmKcodePseudoOps::updateKCodeSel(*this, kcodeSelection, nullptr);
     222                AsmKcodePseudoOps::updateKCodeSel(*this, kcodeSelection);
    223223                kcodeSelection = kcodeSelStack.top();
    224224                kcodeSelStack.pop();
     
    257257 * current kernel regalloc */
    258258void AsmKcodePseudoOps::updateKCodeSel(AsmKcodeHandler& handler,
    259                     const std::vector<AsmKernelId>& oldset, const char* pseudoOpPlace)
     259                    const std::vector<AsmKernelId>& oldset)
    260260{
    261261    Assembler& asmr = handler.assembler;
    262262    // old elements - join current regstate with all them
    263263    size_t regTypesNum;
    264     bool first = true;
    265     bool codeFlagsMismatch = false;
    266264    for (auto it = oldset.begin(); it != oldset.end(); ++it)
    267265    {
    268266        Flags curAllocRegFlags;
    269         Flags curCodeFlags = asmr.isaAssembler->getCodeFlags();
    270         Flags importantCodeFlags = asmr.isaAssembler->getImportantCodeFlags();
     267        AsmKcodeHandler::KernelBase& kernel = handler.getKernelBase(*it);
    271268        const cxuint* curAllocRegs = asmr.isaAssembler->getAllocatedRegisters(regTypesNum,
    272269                               curAllocRegFlags);
    273270        cxuint newAllocRegs[MAX_REGTYPES_NUM];
    274         AsmKcodeHandler::KernelBase& kernel = handler.getKernelBase(*it);
    275271        for (size_t i = 0; i < regTypesNum; i++)
    276272            newAllocRegs[i] = std::max(curAllocRegs[i], kernel.allocRegs[i]);
    277273        kernel.allocRegFlags |= curAllocRegFlags;
     274       
     275        std::copy(newAllocRegs, newAllocRegs+regTypesNum, kernel.allocRegs);
     276    }
     277   
     278    asmr.isaAssembler->setAllocatedRegisters();
     279}
     280
     281void AsmKcodePseudoOps::updateCodeFlags(AsmKcodeHandler& handler,
     282                      const std::vector<cxuint>& newset, const char* pseudoOpPlace)
     283{
     284    Assembler& asmr = handler.assembler;
     285    bool first = true;
     286    bool codeFlagsMismatch = false;
     287    Flags curCodeFlags = 0;
     288    Flags importantCodeFlags = asmr.isaAssembler->getImportantCodeFlags();
     289    for (auto it = newset.begin(); it != newset.end(); ++it)
     290    {
     291        AsmKcodeHandler::KernelBase& kernel = handler.getKernelBase(*it);
    278292        if (!first && ((kernel.codeFlags ^ curCodeFlags) & importantCodeFlags) != 0)
    279293            codeFlagsMismatch = true;
    280294        kernel.codeFlags |= curCodeFlags;
    281         std::copy(newAllocRegs, newAllocRegs+regTypesNum, kernel.allocRegs);
     295        curCodeFlags = kernel.codeFlags;
    282296        first = false;
    283297    }
     298   
    284299    if (codeFlagsMismatch)
    285300    {
     
    289304            asmr.printError(AsmSourcePos(), "Code flags mismatch for kernel set");
    290305    }
    291     asmr.isaAssembler->setAllocatedRegisters();
     306    asmr.isaAssembler->setCodeFlags(curCodeFlags);
    292307}
    293308
     
    367382    }
    368383   
    369     updateKCodeSel(handler, handler.kcodeSelStack.top(), pseudoOpPlace);
     384    updateKCodeSel(handler, handler.kcodeSelStack.top());
     385    updateCodeFlags(handler, handler.kcodeSelection, pseudoOpPlace);
    370386}
    371387
     
    381397        return;
    382398   
    383     updateKCodeSel(handler, handler.kcodeSelection, pseudoOpPlace);
     399    updateKCodeSel(handler, handler.kcodeSelection);
    384400    std::vector<AsmKernelId> oldKCodeSel = handler.kcodeSelection;
    385401    handler.kcodeSelection = handler.kcodeSelStack.top();
     
    397413   
    398414    handler.kcodeSelStack.pop();
     415    updateCodeFlags(handler, handler.kcodeSelection, pseudoOpPlace);
    399416    if (handler.kcodeSelStack.empty())
    400417        handler.restoreKcodeCurrentAllocRegs();
  • CLRadeonExtender/trunk/amdasm/AsmInternals.h

    r4968 r4989  
    341341    static void doKCodeEnd(AsmKcodeHandler& handler, const char* pseudoOpPlace,
    342342                      const char* linePtr);
    343     static void updateKCodeSel(AsmKcodeHandler& handler,
    344                       const std::vector<cxuint>& oldset, const char* pseudoOpPlace);
     343    static void updateKCodeSel(AsmKcodeHandler& handler, const std::vector<cxuint>& oldset);
     344   
     345    static void updateCodeFlags(AsmKcodeHandler& handler,
     346                      const std::vector<cxuint>& newset, const char* pseudoOpPlace);
    345347};
    346348
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegPool.cpp

    r4988 r4989  
    4444static const AsmRegPoolTestCase regPoolTestCasesTbl[] =
    4545{
     46#if 0
    4647    /* gcn asm test cases */
    4748    { ".amd;.kernel xx;.config;.tgsize;.text;s_add_u32 s5,s0,s1", { { "xx", 6, 0 } } },
     
    456457        )ffDXD",
    457458        { { "a1", 1, 1, ASM_CODE_WAVE32 }, { "a2", 2, 1, 0 } }
     459    },
     460#endif
     461    /* rocm wave32 flags 4 */
     462    {
     463        R"ffDXD(            .rocm; .gpu gfx1010
     464    .llvm10binfmt
     465    .metadatav3
     466    .kernel a1
     467    .config
     468        .use_wave32
     469    .kernel a2
     470    .config
     471    .kernel a3
     472    .config
     473    .kernel a4
     474    .config
     475        .use_wave32
     476    .globaldata
     477    .skip 256
     478    .text
     479.p2align 8
     480a1:
     481        v_cmp_gt_i32    vcc_lo, s1, v1
     482        s_endpgm
     483.p2align 8
     484a2:
     485        v_cmp_gt_i32    vcc, s5, v2
     486        s_endpgm
     487.p2align 8
     488a3:
     489        v_cmp_gt_i32    vcc, s5, v2
     490        s_endpgm
     491.p2align 8
     492a4:
     493        v_cmp_gt_i32    vcc_lo, s1, v1
     494.p2align 8
     495x:
     496.kcode a1,a4
     497        v_cmp_gt_i32    vcc_lo, s1, v1
     498.kcodeend
     499.p2align 8
     500y:
     501.kcode a2,a3
     502        v_cmp_gt_i32    vcc, s1, v1
     503        s_endpgm
     504.kcodeend
     505        )ffDXD",
     506        { { "a1", 1, 1, ASM_CODE_WAVE32 }, { "a2", 2, 1, 0 },
     507            { "a3", 2, 1, 0 }, { "a4", 1, 1, ASM_CODE_WAVE32 } }
    458508    }
    459509};
Note: See TracChangeset for help on using the changeset viewer.