Changeset 3077 in CLRX


Ignore:
Timestamp:
May 24, 2017, 6:04:04 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: First testcases for GCNAssembler for AMD VEGA arch.

Location:
CLRadeonExtender/trunk
Files:
1 added
4 edited

Legend:

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

    r3056 r3077  
    442442   
    443443    /* parse single SGPR */
     444    const bool isGCN14 = (arch & ARCH_RXVEGA) != 0;
     445    const cxuint ttmpSize = isGCN14 ? 16 : 12;
     446    const cxuint ttmpStart = isGCN14 ? 108 : 112;
     447       
    444448    const cxuint maxSGPRsNum = getGPUMaxRegsNumByArchMask(arch, REGTYPE_SGPR);
    445449    if (singleSorTtmp)
     
    462466                else
    463467                {   // ttmp register
    464                     if (value >= 12)
     468                    if (value >= ttmpSize)
    465469                    {
    466470                        asmr.printError(sgprRangePlace,
    467                                         "TTMPRegister number out of range (0-11)");
     471                            isGCN14 ? "TTMPRegister number out of range (0-15)" :
     472                            "TTMPRegister number out of range (0-11)");
    468473                        return false;
    469474                    }
     
    484489                }
    485490                else
    486                     regPair = { 112+value, 112+value+1 };
     491                {
     492                   
     493                    regPair = { ttmpStart+value, ttmpStart+value+1 };
     494                }
    487495                return true;
    488496            }
     
    521529            loHiReg = 126;
    522530        }
    523         else if (regName[0]=='t')
     531        else if ((arch & ARCH_RXVEGA) == 0 && regName[0]=='t')
    524532        {   /* tma,tba */
    525533            if (regName[1] == 'b' && regName[2] == 'a')
     
    671679                return false;
    672680            }
    673             if (value1 >= 12 || value2 >= 12)
     681            if (value1 >= ttmpSize || value2 >= ttmpSize)
    674682            {
    675683                asmr.printError(sgprRangePlace,
    676                                 "Some TTMPRegister number out of range (0-11)");
     684                            isGCN14 ? "Some TTMPRegister number out of range (0-15)" :
     685                            "Some TTMPRegister number out of range (0-11)");
    677686                return false;
    678687            }
     
    701710        }
    702711        else
    703             regPair = { 112+value1, 112+uint16_t(value2)+1 };
     712            regPair = { ttmpStart+value1, ttmpStart+uint16_t(value2)+1 };
    704713        return true;
    705714    }
     
    921930    return parseImm(asmr, linePtr, value, outTargetExpr);
    922931}
     932
     933static const std::pair<const char*, uint16_t> ssourceNamesTbl[] =
     934{
     935    { "execz", 252 },
     936    { "scc", 253 },
     937    { "src_execz", 252 },
     938    { "src_scc", 253 },
     939    { "src_vccz", 251 },
     940    { "vccz", 251 }
     941};
     942
     943static const size_t ssourceNamesTblSize = sizeof(ssourceNamesTbl) /
     944        sizeof(std::pair<const char*, uint16_t>);
     945
     946static const std::pair<const char*, uint16_t> ssourceNamesGCN14Tbl[] =
     947{
     948    { "execz", 252 },
     949    { "pops_exiting_wave_id", 0xef },
     950    { "private_base", 0xed },
     951    { "private_limit", 0xee },
     952    { "scc", 253 },
     953    { "shared_base", 0xeb },
     954    { "shared_limit", 0xec },
     955    { "src_execz", 252 },
     956    { "src_pops_exiting_wave_id", 0xef },
     957    { "src_private_base", 0xed },
     958    { "src_private_limit", 0xee },
     959    { "src_scc", 253 },
     960    { "src_shared_base", 0xeb },
     961    { "src_shared_limit", 0xec },
     962    { "src_vccz", 251 },
     963    { "vccz", 251 }
     964};
     965
     966static const size_t ssourceNamesGCN14TblSize = sizeof(ssourceNamesGCN14Tbl) /
     967        sizeof(std::pair<const char*, uint16_t>);
    923968
    924969bool GCNAsmUtils::parseOperand(Assembler& asmr, const char*& linePtr, GCNOperand& operand,
     
    10801125    if ((instrOpMask & INSTROP_SSOURCE)!=0)
    10811126    {
    1082         char regName[20];
     1127        char regName[25];
    10831128        const char* regNamePlace = linePtr;
    1084         if (getNameArg(asmr, 20, regName, linePtr, "register name", false, true))
     1129        if (getNameArg(asmr, 25, regName, linePtr, "register name", false, true))
    10851130        {
    10861131            toLowerString(regName);
    10871132            operand.range = {0, 0};
    1088             if (::strcmp(regName, "vccz") == 0 || ::strcmp(regName, "src_vccz") == 0)
    1089             {
    1090                 operand.range = { 251, 252 };
    1091                 return true;
    1092             }
    1093             else if (::strcmp(regName, "execz") == 0 ||
    1094                     ::strcmp(regName, "src_execz") == 0)
    1095             {
    1096                 operand.range = { 252, 253 };
    1097                 return true;
    1098             }
    1099             else if (::strcmp(regName, "scc") == 0 || ::strcmp(regName, "src_scc") == 0)
    1100             {
    1101                 operand.range = { 253, 254 };
     1133           
     1134            auto regNameTblEnd = (arch & ARCH_RXVEGA) ?
     1135                        ssourceNamesGCN14Tbl + ssourceNamesGCN14TblSize :
     1136                        ssourceNamesTbl + ssourceNamesTblSize;
     1137            auto regNameIt = binaryMapFind(
     1138                    (arch & ARCH_RXVEGA) ? ssourceNamesGCN14Tbl : ssourceNamesTbl,
     1139                    regNameTblEnd, regName, CStringLess());
     1140           
     1141            if (regNameIt != regNameTblEnd)
     1142            {
     1143                operand.range = { regNameIt->second, regNameIt->second+1 };
    11021144                return true;
    11031145            }
  • CLRadeonExtender/trunk/tests/amdasm/CMakeLists.txt

    r3057 r3077  
    6565        GCNAsmOpcodes.cpp
    6666        GCNAsmOpc11.cpp
    67         GCNAsmOpc12.cpp)
     67        GCNAsmOpc12.cpp
     68        GCNAsmOpc14.cpp)
    6869TEST_LINK_LIBRARIES(GCNAsmOpcodes CLRXAmdAsm CLRXAmdBin CLRXUtils)
    6970ADD_TEST(GCNAsmOpcodes GCNAsmOpcodes)
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc.h

    r2682 r3077  
    3535extern const GCNAsmOpcodeCase encGCN11OpcodeCases[];
    3636extern const GCNAsmOpcodeCase encGCN12OpcodeCases[];
     37extern const GCNAsmOpcodeCase encGCN14OpcodeCases[];
    3738
    3839#endif
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpcodes.cpp

    r2682 r3077  
    114114            retVal = 1;
    115115        }
     116    for (cxuint i = 0; encGCN14OpcodeCases[i].input!=nullptr; i++)
     117        try
     118        { testEncGCNOpcodes(i, encGCN14OpcodeCases[i], GPUDeviceType::GFX900); }
     119        catch(const std::exception& ex)
     120        {
     121            std::cerr << ex.what() << std::endl;
     122            retVal = 1;
     123        }
    116124    return retVal;
    117125}
Note: See TracChangeset for help on using the changeset viewer.