Changeset 1662 in CLRX


Ignore:
Timestamp:
Nov 5, 2015, 11:22:30 PM (5 years ago)
Author:
matszpk
Message:

CLRadeonExtender: Asm: Fixed register assignment to symbol. GCNAsm: Accepts register range from symbol.

Location:
CLRadeonExtender/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/amdasm/Assembler.h

    r1661 r1662  
    259259            refCount(1), sectionId(ASMSECT_ABS), info(0), other(0), hasValue(false),
    260260            onceDefined(_onceDefined), resolving(false), base(false), snapshot(false),
    261             value(0), size(0), expression(nullptr)
     261            regRange(false), value(0), size(0), expression(nullptr)
    262262    { }
    263263    /// constructor with expression
     
    265265            refCount(1), sectionId(ASMSECT_ABS), info(0), other(0), hasValue(false),
    266266            onceDefined(_onceDefined), resolving(false), base(_base),
    267             snapshot(false), value(0), size(0), expression(expr)
     267            snapshot(false), regRange(false), value(0), size(0), expression(expr)
    268268    { }
    269269    /// constructor with value and section id
     
    271271            refCount(1), sectionId(_sectionId), info(0), other(0), hasValue(true),
    272272            onceDefined(_onceDefined), resolving(false), base(false), snapshot(false),
    273             value(_value), size(0), expression(nullptr)
     273            regRange(false), value(_value), size(0), expression(nullptr)
    274274    { }
    275275    /// destructor
  • CLRadeonExtender/trunk/amdasm/Assembler.cpp

    r1661 r1662  
    976976        symEntry.second.regRange = symEntry.second.hasValue = true;
    977977        symEntry.second.value = (regStart | (uint64_t(regEnd)<<32));
    978     }
    979        
     978        return true;
     979    }
     980   
    980981    const char* exprPlace = linePtr;
    981982    // make base expr if baseExpr=true and symbolName is not output counter
  • CLRadeonExtender/trunk/amdasm/GCNAsmHelpers.cpp

    r1660 r1662  
    7474    skipSpacesToEnd(linePtr, end);
    7575    const char* vgprRangePlace = linePtr;
    76     if (linePtr == end || toLower(*linePtr) != 'v' || ++linePtr == end)
    77     {
     76    if (linePtr == end || toLower(*linePtr) != 'v' || linePtr+1 == end ||
     77        (!isDigit(linePtr[1]) && linePtr[1]!='['))
     78    {
     79        if (linePtr!=end)
     80        {   // check whether is name of symbol with register
     81            AsmSymbolEntry* symEntry = nullptr;
     82            if (asmr.parseSymbol(linePtr, symEntry, false, true)==
     83                Assembler::ParseState::PARSED && symEntry!=nullptr &&
     84                symEntry->second.regRange)
     85            { // set up regrange
     86                cxuint rstart = symEntry->second.value&UINT_MAX;
     87                cxuint rend = symEntry->second.value>>32;
     88                if (rstart >= 256 && rend >= 256)
     89                {
     90                    if (regsNum!=0 && regsNum != rend-rstart)
     91                    {
     92                        printXRegistersRequired(asmr, vgprRangePlace, "vector", regsNum);
     93                        return false;
     94                    }
     95                    regPair = { rstart, rend };
     96                    return true;
     97                }
     98            }
     99        }
    78100        if (printRegisterRangeExpected(asmr, vgprRangePlace, "vector", regsNum, required))
    79101            return false;
     
    82104        return true;
    83105    }
     106    linePtr++;
    84107   
    85108    try /* for handling parse exception */
     
    177200    try
    178201    {
    179     if (linePtr+4 <= end && toLower(linePtr[0]) == 't' &&
     202    if (linePtr+4 < end && toLower(linePtr[0]) == 't' &&
    180203        toLower(linePtr[1]) == 't' && toLower(linePtr[2]) == 'm' &&
    181         toLower(linePtr[3]) == 'p')
     204        toLower(linePtr[3]) == 'p' && (isDigit(linePtr[4]) || linePtr[4]=='['))
    182205        ttmpReg = true; // we have ttmp registers
    183     else if (toLower(*linePtr) != 's') // if not sgprs
     206    else if (toLower(*linePtr) != 's' || linePtr+1==end ||
     207        (!isDigit(linePtr[1]) && linePtr[1]!='[')) // if not sgprs
    184208    {
    185209        const char* oldLinePtr = linePtr;
     
    277301        else
    278302        {   // otherwise
     303            // check whether is name of symbol with register
     304            AsmSymbolEntry* symEntry = nullptr;
     305            linePtr = oldLinePtr;
     306            if (asmr.parseSymbol(linePtr, symEntry, false, true)==
     307                Assembler::ParseState::PARSED && symEntry!=nullptr &&
     308                symEntry->second.regRange)
     309            { // set up regrange
     310                cxuint rstart = symEntry->second.value&UINT_MAX;
     311                cxuint rend = symEntry->second.value>>32;
     312                if (rstart < 256 && rend <= 256)
     313                {
     314                    if (regsNum!=0 && regsNum != rend-rstart)
     315                    {
     316                        printXRegistersRequired(asmr, sgprRangePlace, "scalar", regsNum);
     317                        return false;
     318                    }
     319                    regPair = { rstart, rend };
     320                    return true;
     321                }
     322            }
    279323            if (printRegisterRangeExpected(asmr, sgprRangePlace, "scalar",
    280324                            regsNum, required))
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc11.cpp

    r1660 r1662  
    123123        "test.s:1:22: Error: Expected ',' before argument\n" },
    124124    { "    s_add_u32  sxzz, s4, s61", 0, 0, false, false,
    125         "test.s:1:16: Error: Expected 1 scalar register\n"
    126         "test.s:1:17: Error: Expected ',' before argument\n" },
     125        "test.s:1:16: Error: Expected 1 scalar register\n" },
    127126    { "    s_add_u32  ttmpxzz, s4, s61", 0, 0, false, false,
    128         "test.s:1:16: Error: Expected 1 scalar register\n"
    129         "test.s:1:20: Error: Expected ',' before argument\n" },
     127        "test.s:1:16: Error: Expected 1 scalar register\n" },
    130128    { "    s_add_u32  s30, s[4, s[61", 0, 0, false, false,
    131129        "test.s:1:21: Error: Unterminated scalar register range\n"
Note: See TracChangeset for help on using the changeset viewer.