Changeset 4856 in CLRX


Ignore:
Timestamp:
Jul 27, 2019, 9:23:55 PM (4 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add parseVRegRangesLimited routine to parse MIMG VADDR register list.

Location:
CLRadeonExtender/trunk/amdasm
Files:
2 edited

Legend:

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

    r4847 r4856  
    445445        return false;
    446446    }
     447}
     448
     449bool GCNAsmUtils::parseVRegRangesLimited(Assembler& asmr, const char*& linePtr,
     450                   cxuint vgprsLimit, std::vector<RegRange>& regPairs,
     451                   AsmRegField regField, bool required, Flags flags)
     452{
     453    const char* oldLinePtr = linePtr;
     454    const char* end = asmr.line+asmr.lineSize;
     455    regPairs.clear();
     456    skipSpacesToEnd(linePtr, end);
     457    if (linePtr==end && *linePtr!='[')
     458    {
     459        linePtr = oldLinePtr;
     460        return false;
     461    }
     462   
     463    skipCharAndSpacesToEnd(linePtr, end);
     464    // real parsing
     465    cxuint curRegField = regField;
     466    for (cxuint parsedVgprs = 0; parsedVgprs < vgprsLimit;)
     467    {
     468        const char *curRangePlace = linePtr;
     469        regPairs.push_back({ 0, 0 });
     470        if (!parseVRegRange(asmr, linePtr, regPairs.back(), 0,
     471                            curRegField, required, flags))
     472            return false;
     473        const RegRange& rpair = regPairs.back();
     474        if (cxuint(rpair.end-rpair.start) > vgprsLimit-parsedVgprs)
     475            ASM_FAIL_BY_ERROR(curRangePlace,
     476                              "Register range have more registers than left")
     477        parsedVgprs += rpair.end-rpair.start;
     478        skipSpacesToEnd(linePtr, end);
     479        if (linePtr!=end && *linePtr==']' && parsedVgprs!=vgprsLimit)
     480        {
     481            char buf[60];
     482            snprintf(buf, 60, "VGPR register list requires %u registers", vgprsLimit);
     483            ASM_FAIL_BY_ERROR(curRangePlace, buf)
     484        }
     485        else if (linePtr!=end && *linePtr==',')
     486        {
     487            if (parsedVgprs==vgprsLimit)
     488            {
     489                char buf[60];
     490                snprintf(buf, 60, "VGPR register list need no more than %u registers",
     491                                    vgprsLimit);
     492                ASM_FAIL_BY_ERROR(curRangePlace, buf)
     493            }
     494            skipCharAndSpacesToEnd(linePtr, end);
     495        }
     496        else
     497            ASM_FAIL_BY_ERROR(curRangePlace, "Expected ',' in  VGPR register list")
     498        curRegField++;
     499    }
     500    return true;
    447501}
    448502
  • CLRadeonExtender/trunk/amdasm/GCNAsmInternals.h

    r4810 r4856  
    207207    static bool parseVRegRange(Assembler& asmr, const char*& linePtr, RegRange& regPair,
    208208                   cxuint regsNum, AsmRegField regField, bool required = true,
     209                   Flags flags = INSTROP_SYMREGRANGE);
     210    /* return true if no error */
     211    static bool parseVRegRangesLimited(Assembler& asmr, const char*& linePtr,
     212                   cxuint vgprsLimit, std::vector<RegRange>& regPairs,
     213                   AsmRegField regField, bool required = true,
    209214                   Flags flags = INSTROP_SYMREGRANGE);
    210215    /* return true if no error */
Note: See TracChangeset for help on using the changeset viewer.