Changeset 2592 in CLRX


Ignore:
Timestamp:
Nov 24, 2016, 8:56:45 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmROCm: Add setDimensions, Kcode support.

File:
1 edited

Legend:

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

    r2591 r2592  
    627627                  const char* linePtr)
    628628{
     629    Assembler& asmr = handler.assembler;
     630    const char* end = asmr.line + asmr.lineSize;
     631    if (asmr.currentKernel==ASMKERN_GLOBAL ||
     632        asmr.sections[asmr.currentSection].type != AsmSectionType::CONFIG)
     633    {
     634        asmr.printError(pseudoOpPlace, "Illegal place of configuration pseudo-op");
     635        return;
     636    }
     637    skipSpacesToEnd(linePtr, end);
     638    const char* dimPlace = linePtr;
     639    char buf[10];
     640    cxuint dimMask = 0;
     641    if (getNameArg(asmr, 10, buf, linePtr, "dimension set", false))
     642    {
     643        toLowerString(buf);
     644        for (cxuint i = 0; buf[i]!=0; i++)
     645            if (buf[i]=='x')
     646                dimMask |= 1;
     647            else if (buf[i]=='y')
     648                dimMask |= 2;
     649            else if (buf[i]=='z')
     650                dimMask |= 4;
     651            else
     652            {
     653                asmr.printError(dimPlace, "Unknown dimension type");
     654                return;
     655            }
     656    }
     657    else // error
     658        return;
     659    if (!checkGarbagesAtEnd(asmr, linePtr))
     660        return;
     661    handler.kernelStates[asmr.currentKernel]->initializeKernelConfig();
     662    handler.kernelStates[asmr.currentKernel]->config->dimMask = dimMask;
     663}
     664
     665void AsmROCmPseudoOps::updateKCodeSel(AsmROCmHandler& handler,
     666                  const std::vector<cxuint>& oldset)
     667{
     668    Assembler& asmr = handler.assembler;
     669    // old elements - join current regstate with all them
     670    size_t regTypesNum;
     671    for (auto it = oldset.begin(); it != oldset.end(); ++it)
     672    {
     673        Flags curAllocRegFlags;
     674        const cxuint* curAllocRegs = asmr.isaAssembler->getAllocatedRegisters(regTypesNum,
     675                               curAllocRegFlags);
     676        cxuint newAllocRegs[2];
     677        AsmROCmHandler::Kernel& kernel = *(handler.kernelStates[*it]);
     678        newAllocRegs[0] = std::max(curAllocRegs[0], kernel.allocRegs[0]);
     679        newAllocRegs[1] = std::max(curAllocRegs[1], kernel.allocRegs[1]);
     680        kernel.allocRegFlags |= curAllocRegFlags;
     681        std::copy(newAllocRegs, newAllocRegs+2, kernel.allocRegs);
     682    }
     683    asmr.isaAssembler->setAllocatedRegisters();
    629684}
    630685
     
    632687                  const char* linePtr)
    633688{
     689    Assembler& asmr = handler.assembler;
     690    const char* end = asmr.line + asmr.lineSize;
     691    bool good = true;
     692    skipSpacesToEnd(linePtr, end);
     693    if (linePtr==end)
     694        return;
     695    std::unordered_set<cxuint> newSel(handler.kcodeSelection.begin(),
     696                          handler.kcodeSelection.end());
     697    do {
     698        CString kname;
     699        const char* knamePlace = linePtr;
     700        skipSpacesToEnd(linePtr, end);
     701        bool removeKernel = false;
     702        if (linePtr!=end && *linePtr=='-')
     703        {   // '-' - remove this kernel from current kernel selection
     704            removeKernel = true;
     705            linePtr++;
     706        }
     707        else if (linePtr!=end && *linePtr=='+')
     708        {
     709            linePtr++;
     710            skipSpacesToEnd(linePtr, end);
     711            if (linePtr==end)
     712            {   // add all kernels
     713                for (cxuint k = 0; k < handler.kernelStates.size(); k++)
     714                    newSel.insert(k);
     715                break;
     716            }
     717        }
     718       
     719        if (!getNameArg(asmr, kname, linePtr, "kernel"))
     720        { good = false; continue; }
     721        auto kit = asmr.kernelMap.find(kname);
     722        if (kit == asmr.kernelMap.end())
     723        {
     724            asmr.printError(knamePlace, "Kernel not found");
     725            continue;
     726        }
     727        if (!removeKernel)
     728            newSel.insert(kit->second);
     729        else // remove kernel
     730            newSel.erase(kit->second);
     731    } while (skipCommaForMultipleArgs(asmr, linePtr));
     732   
     733    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
     734        return;
     735   
     736    if (handler.sections[asmr.currentSection].type != AsmSectionType::CODE)
     737    {
     738        asmr.printError(pseudoOpPlace, "KCode outside code");
     739        return;
     740    }
     741    if (handler.kcodeSelStack.empty())
     742        handler.saveKcodeCurrentAllocRegs();
     743    // push to stack
     744    handler.kcodeSelStack.push(handler.kcodeSelection);
     745    // set current sel
     746    handler.kcodeSelection.assign(newSel.begin(), newSel.end());
     747   
     748    std::sort(handler.kcodeSelection.begin(), handler.kcodeSelection.end());
     749    updateKCodeSel(handler, handler.kcodeSelStack.top());
    634750}
    635751
     
    637753                  const char* linePtr)
    638754{
    639 }
    640 
    641 void AsmROCmPseudoOps::updateKCodeSel(AsmROCmHandler& handler,
    642                   const std::vector<cxuint>& oldset)
    643 {
     755    Assembler& asmr = handler.assembler;
     756    if (handler.sections[asmr.currentSection].type != AsmSectionType::CODE)
     757    {
     758        asmr.printError(pseudoOpPlace, "KCodeEnd outside code");
     759        return;
     760    }
     761    if (handler.kcodeSelStack.empty())
     762    {
     763        asmr.printError(pseudoOpPlace, "'.kcodeend' without '.kcode'");
     764        return;
     765    }
     766    updateKCodeSel(handler, handler.kcodeSelection);
     767    handler.kcodeSelection = handler.kcodeSelStack.top();
     768    handler.kcodeSelStack.pop();
     769    if (handler.kcodeSelStack.empty())
     770        handler.restoreKcodeCurrentAllocRegs();
    644771}
    645772
Note: See TracChangeset for help on using the changeset viewer.