Changeset 3091 in CLRX


Ignore:
Timestamp:
May 28, 2017, 5:13:46 PM (19 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add parametrization to hwregisters and sendmsg.

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r3090 r3091  
    648648        skipSpacesToEnd(linePtr, end);
    649649        cxuint hwregId = 0;
    650         const char* hwregNamePlace = linePtr;
    651         const size_t regMapSize = isGCN14 ? hwregNamesGCN14MapSize : hwregNamesMapSize;
    652         const std::pair<const char*, cxuint>* regMap = isGCN14 ?
    653                     hwregNamesGCN14Map : hwregNamesMap;
    654         good &= getEnumeration(asmr, linePtr, "HWRegister",
    655                       regMapSize, regMap, hwregId, "hwreg_");
    656         if (good && (arch & ARCH_GCN_1_2_4) == 0 && hwregId == 13)
    657         {   // if ib_dgb1 in not GCN 1.2
    658             asmr.printError(hwregNamePlace, "Unknown HWRegister");
    659             good = false;
     650        if (linePtr == end || *linePtr!='@')
     651        {
     652            const char* hwregNamePlace = linePtr;
     653            const size_t regMapSize = isGCN14 ? hwregNamesGCN14MapSize : hwregNamesMapSize;
     654            const std::pair<const char*, cxuint>* regMap = isGCN14 ?
     655                        hwregNamesGCN14Map : hwregNamesMap;
     656            good &= getEnumeration(asmr, linePtr, "HWRegister",
     657                        regMapSize, regMap, hwregId, "hwreg_");
     658            if (good && (arch & ARCH_GCN_1_2_4) == 0 && hwregId == 13)
     659            {   // if ib_dgb1 in not GCN 1.2
     660                asmr.printError(hwregNamePlace, "Unknown HWRegister");
     661                good = false;
     662            }
     663        }
     664        else
     665        {   // parametrization
     666            linePtr++;
     667            good &= parseImm(asmr, linePtr, hwregId, nullptr, 6, WS_UNSIGNED);
    660668        }
    661669       
     
    10031011            const char* funcArg1Place = linePtr;
    10041012            size_t sendMessage = 0;
    1005             if (getNameArg(asmr, 25, name, linePtr, "message name", true))
    1006             {
    1007                 toLowerString(name);
    1008                 const size_t msgNameIndex = (::strncmp(name, "msg_", 4) == 0) ? 4 : 0;
    1009                 auto msgMap = isGCN14 ? sendMessageNamesGCN14Map :
    1010                         sendMessageNamesMap;
    1011                 const size_t msgMapSize = isGCN14 ?
    1012                         sendMessageNamesGCN14MapSize : sendMessageNamesMapSize;
    1013                 size_t index = binaryMapFind(msgMap, msgMap + msgMapSize,
    1014                          name+msgNameIndex, CStringLess()) - msgMap;
    1015                 if (index != msgMapSize &&
    1016                     // save_wave only for GCN1.2
    1017                     (msgMap[index].second!=4 || (arch&ARCH_GCN_1_2_4)!=0))
    1018                     sendMessage = msgMap[index].second;
    1019                 else
    1020                 {
    1021                     asmr.printError(funcArg1Place, "Unknown message");
    1022                     good = false;
    1023                 }
    1024             }
    1025             else
    1026                 good = false;
    1027            
    1028             cxuint gsopIndex = 0;
    1029             cxuint streamId = 0;
    1030             if (sendMessage == 2 || sendMessage == 3)
    1031             {
    1032                 if (!skipRequiredComma(asmr, linePtr))
    1033                     return false;
    1034                 skipSpacesToEnd(linePtr, end);
    1035                 const char* funcArg2Place = linePtr;
    1036                 if (getNameArg(asmr, 20, name, linePtr, "GSOP", true))
     1013            if (linePtr == end || *linePtr != '@')
     1014            {
     1015                if (getNameArg(asmr, 25, name, linePtr, "message name", true))
    10371016                {
    10381017                    toLowerString(name);
    1039                     const size_t gsopNameIndex = (::strncmp(name, "gs_op_", 6) == 0)
    1040                                 ? 6 : 0;
    1041                     for (gsopIndex = 0; gsopIndex < 4; gsopIndex++)
    1042                         if (::strcmp(name+gsopNameIndex, sendMsgGSOPTable[gsopIndex])==0)
    1043                             break;
    1044                     if (gsopIndex==2 && gsopNameIndex==0)
    1045                     {   /* 'emit-cut' handling */
    1046                         if (linePtr+4<end && ::strncmp(linePtr, "-cut", 4)==0 &&
    1047                             (linePtr==end || (!isAlnum(*linePtr) && *linePtr!='_' &&
    1048                             *linePtr!='$' && *linePtr!='.')))
    1049                         {
    1050                             linePtr+=4;
    1051                             gsopIndex++;
    1052                         }
    1053                     }
    1054                     if (gsopIndex == 4)
    1055                     {   // not found
    1056                         gsopIndex = 0;
    1057                         asmr.printError(funcArg2Place, "Unknown GSOP");
     1018                    const size_t msgNameIndex = (::strncmp(name, "msg_", 4) == 0) ? 4 : 0;
     1019                    auto msgMap = isGCN14 ? sendMessageNamesGCN14Map :
     1020                            sendMessageNamesMap;
     1021                    const size_t msgMapSize = isGCN14 ?
     1022                            sendMessageNamesGCN14MapSize : sendMessageNamesMapSize;
     1023                    size_t index = binaryMapFind(msgMap, msgMap + msgMapSize,
     1024                            name+msgNameIndex, CStringLess()) - msgMap;
     1025                    if (index != msgMapSize &&
     1026                        // save_wave only for GCN1.2
     1027                        (msgMap[index].second!=4 || (arch&ARCH_GCN_1_2_4)!=0))
     1028                        sendMessage = msgMap[index].second;
     1029                    else
     1030                    {
     1031                        asmr.printError(funcArg1Place, "Unknown message");
    10581032                        good = false;
    10591033                    }
     
    10611035                else
    10621036                    good = false;
     1037            }
     1038            else
     1039            {   // parametrization
     1040                linePtr++;
     1041                good &= parseImm(asmr, linePtr, sendMessage, nullptr, 4, WS_UNSIGNED);
     1042            }
     1043           
     1044            cxuint gsopIndex = 0;
     1045            cxuint streamId = 0;
     1046            if (sendMessage == 2 || sendMessage == 3)
     1047            {
     1048                if (!skipRequiredComma(asmr, linePtr))
     1049                    return false;
     1050                skipSpacesToEnd(linePtr, end);
     1051                if (linePtr == end || *linePtr != '@')
     1052                {
     1053                    const char* funcArg2Place = linePtr;
     1054                    if (getNameArg(asmr, 20, name, linePtr, "GSOP", true))
     1055                    {
     1056                        toLowerString(name);
     1057                        const size_t gsopNameIndex = (::strncmp(name, "gs_op_", 6) == 0)
     1058                                    ? 6 : 0;
     1059                        for (gsopIndex = 0; gsopIndex < 4; gsopIndex++)
     1060                            if (::strcmp(name+gsopNameIndex, sendMsgGSOPTable[gsopIndex])==0)
     1061                                break;
     1062                        if (gsopIndex==2 && gsopNameIndex==0)
     1063                        {   /* 'emit-cut' handling */
     1064                            if (linePtr+4<end && ::strncmp(linePtr, "-cut", 4)==0 &&
     1065                                (linePtr==end || (!isAlnum(*linePtr) && *linePtr!='_' &&
     1066                                *linePtr!='$' && *linePtr!='.')))
     1067                            {
     1068                                linePtr+=4;
     1069                                gsopIndex++;
     1070                            }
     1071                        }
     1072                        if (gsopIndex == 4)
     1073                        {   // not found
     1074                            gsopIndex = 0;
     1075                            asmr.printError(funcArg2Place, "Unknown GSOP");
     1076                            good = false;
     1077                        }
     1078                    }
     1079                    else
     1080                        good = false;
     1081                }
     1082                else
     1083                {   // parametrization
     1084                    linePtr++;
     1085                    good &= parseImm(asmr, linePtr, gsopIndex, nullptr, 3, WS_UNSIGNED);
     1086                }
    10631087               
    10641088                if (gsopIndex!=0)
  • CLRadeonExtender/trunk/doc/GcnOperands.md

    r3090 r3091  
    164164The `omod` modifier with parameter (expression) replaces `mul` and `div` modifiers.
    165165The `format` in MTBUF encoding is also parametrizable if data and/or
    166 number format expression will be preceded by `@` character.
     166number format expression will be preceded by `@` character (example: `format[@1,@4]`).
     167
     168The HW registers and send message parameters (message and GSOP) is parametrizable if
     169they will be preceded by `@` (example: `hwreg(@5)`).
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc11.cpp

    r3090 r3091  
    382382    { "    s_getreg_b32    s43, hwreg(trapsts, 3, 10)", 0xb92b48c3u, 0, false, true, "" },
    383383    { "    s_getreg_b32    s43, hwreg(trapsts, 3, 32)", 0xb92bf8c3u, 0, false, true, "" },
     384    { "    s_getreg_b32    s43, hwreg(@10, 0, 1)", 0xb92b000aU, 0, false, true, "" },
     385    { "    s_getreg_b32    s43, hwreg(@8, 0, 1)", 0xb92b0008U, 0, false, true, "" },
    384386    { "    s_setreg_imm32_b32 hwreg(trapsts, 3, 10), 0x24da4f",
    385387                    0xba8048c3u, 0x24da4fU, true, true, "" },
     
    502504    { "    s_sendmsg  sendmsg(MSG_GS_DONE, GS_OP_NOP)", 0xbf900003U, 0, false, true, "" },
    503505    { "    s_sendmsghalt  sendmsg(interrupt)", 0xbf910001U, 0, false, true, "" },
     506    { "    s_sendmsg  sendmsg(@2, GS_OP_CUT, 0)", 0xbf900012U, 0, false, true, "" },
     507    { "    s_sendmsg  sendmsg(@2, @1, 0)", 0xbf900012U, 0, false, true, "" },
    504508    /* msg errors */
    505509    { "    s_sendmsg  sendmsg(interrupxt)", 0, 0, false, false,
Note: See TracChangeset for help on using the changeset viewer.