Changeset 3088 in CLRX


Ignore:
Timestamp:
May 28, 2017, 4:06:33 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Allow to parametrize modifiers (by ':expr' syntax). allow to use expression in quad_perm params.

Location:
CLRadeonExtender/trunk
Files:
5 edited

Legend:

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

    r3084 r3088  
    16211621                else if (::strcmp(mod, "clamp")==0) // clamp
    16221622                {
     1623                    bool clamp = false;
     1624                    good &= parseModEnable(asmr, linePtr, clamp, "clamp modifier");
    16231625                    if (withClamp)
    1624                         mods |= VOP3_CLAMP;
     1626                        mods = (mods & ~VOP3_CLAMP) | (clamp ? VOP3_CLAMP : 0);
    16251627                    else
    16261628                    {
     
    16301632                }
    16311633                else if (::strcmp(mod, "vop3")==0)
    1632                     mods |= VOP3_VOP3;
     1634                {
     1635                    bool vop3 = false;
     1636                    good &= parseModEnable(asmr, linePtr, vop3, "vop3 modifier");
     1637                    mods = (mods & ~VOP3_VOP3) | (vop3 ? VOP3_VOP3 : 0);
     1638                }
    16331639                else if (extraMods!=nullptr)
    16341640                {   /* parse specific modofier from VOP_SDWA or VOP_DPP encoding */
     
    17701776                                try
    17711777                                {
    1772                                     cxbyte qpv = cstrtobyte(linePtr, end);
    1773                                     if (qpv<4)
    1774                                         quadPerm |= qpv<<(k<<1);
    1775                                     else
    1776                                     {
    1777                                         asmr.printError(linePtr,
    1778                                             "quad_perm component out of range (0-3)");
    1779                                         goodMod = good = false;
    1780                                     }
     1778                                    cxbyte qpv = 0;
     1779                                    good &= parseImm(asmr, linePtr, qpv, nullptr,
     1780                                            2, WS_UNSIGNED);
     1781                                    quadPerm |= qpv<<(k<<1);
    17811782                                }
    17821783                                catch(const ParseException& ex)
  • CLRadeonExtender/trunk/amdasm/GCNAsmInternals.h

    r3084 r3088  
    228228    }
    229229   
     230    static bool parseModEnable(Assembler& asmr, const char*& linePtr, bool& value,
     231            const char* modName)
     232    {
     233        cxbyte val = 0;
     234        const char* end = asmr.line+asmr.lineSize;
     235        skipSpacesToEnd(linePtr, end);
     236        if (linePtr==end || *linePtr!=':')
     237        {   // by default is enabled
     238            value = true;
     239            return true;
     240        }
     241       
     242        bool ret = parseModImm(asmr, linePtr, val, nullptr, modName, 1, WS_UNSIGNED);
     243        value = val!=0;
     244        return ret;
     245    }
     246   
    230247    static bool parseVINTRP0P10P20(Assembler& asmr, const char*& linePtr, RegRange& reg);
    231248    static bool parseVINTRPAttr(Assembler& asmr, const char*& linePtr, cxbyte& attr);
  • CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp

    r3084 r3088  
    21202120                    continue;
    21212121                if (::strcmp(modName, "high")==0)
    2122                     modHigh = true;
     2122                    good &= parseModEnable(asmr, linePtr, modHigh, "high modifier");
    21232123                else if (::strcmp(modName, "vop3")==0)
    2124                     modifiers |= VOP3_VOP3;
     2124                {
     2125                    bool vop3Mod = false;
     2126                    good &= parseModEnable(asmr, linePtr, vop3Mod, "vop3 modifier");
     2127                    modifiers = (modifiers & ~VOP3_VOP3) | (vop3Mod ? VOP3_VOP3 : 0);
     2128                }
    21252129                else
    21262130                {
     
    24252429        toLowerString(name);
    24262430        if (::strcmp(name, "gds")==0)
    2427             haveGds = true;
     2431            good &= parseModEnable(asmr, linePtr, haveGds, "gds modifier");
    24282432        else if ((gcnInsn.mode & GCN_2OFFSETS) == 0) /* single offset */
    24292433        {
     
    26582662        {   // offen, offset
    26592663            if (::strcmp(name+1, "ffen")==0)
    2660                 haveOffen = true;
     2664                good &= parseModEnable(asmr, linePtr, haveOffen, "offen modifier");
    26612665            else if (::strcmp(name+1, "ffset")==0)
    26622666            {   // parse offset
     
    27552759        }
    27562760        else if (!isGCN12 && ::strcmp(name, "addr64")==0)
    2757             haveAddr64 = true;
     2761            good &= parseModEnable(asmr, linePtr, haveAddr64, "addr64 modifier");
    27582762        else if (::strcmp(name, "tfe")==0)
    2759             haveTfe = true;
     2763            good &= parseModEnable(asmr, linePtr, haveTfe, "tfe modifier");
    27602764        else if (::strcmp(name, "glc")==0)
    2761             haveGlc = true;
     2765            good &= parseModEnable(asmr, linePtr, haveGlc, "glc modifier");
    27622766        else if (::strcmp(name, "slc")==0)
    2763             haveSlc = true;
     2767            good &= parseModEnable(asmr, linePtr, haveSlc, "slc modifier");
    27642768        else if (gcnInsn.encoding==GCNENC_MUBUF && ::strcmp(name, "lds")==0)
    2765             haveLds = true;
     2769            good &= parseModEnable(asmr, linePtr, haveLds, "lds modifier");
    27662770        else if (::strcmp(name, "idxen")==0)
    2767             haveIdxen = true;
     2771            good &= parseModEnable(asmr, linePtr, haveIdxen, "idxen modifier");
    27682772        else
    27692773        {
     
    29902994        {
    29912995            if (name[1]=='a' && name[2]==0)
    2992                 haveDa = true;
    2993             else if ((arch & ARCH_GCN_1_2_4)!=0 && name[1]=='1' && name[2]=='6' && name[3]==0)
    2994                 haveD16 = true;
     2996                good &= parseModEnable(asmr, linePtr, haveDa, "da modifier");
     2997            else if ((arch & ARCH_GCN_1_2_4)!=0 && name[1]=='1' &&
     2998                name[2]=='6' && name[3]==0)
     2999                good &= parseModEnable(asmr, linePtr, haveD16, "d16 modifier");
    29953000            else if (::strcmp(name+1, "mask")==0)
    29963001            {
     
    30343039        {
    30353040            if (::strcmp(name, "glc")==0)
    3036                 haveGlc = true;
     3041                good &= parseModEnable(asmr, linePtr, haveGlc, "glc modifier");
    30373042            else if (::strcmp(name, "lwe")==0)
    3038                 haveLwe = true;
     3043                good &= parseModEnable(asmr, linePtr, haveLwe, "lwe modifier");
    30393044            else if (::strcmp(name, "r128")==0)
    3040                 haveR128 = true;
     3045                good &= parseModEnable(asmr, linePtr, haveR128, "r128 modifier");
    30413046            else
    30423047            {
     
    30463051        }
    30473052        else if (::strcmp(name, "tfe")==0)
    3048             haveTfe = true;
     3053            good &= parseModEnable(asmr, linePtr, haveTfe, "tfe modifier");
    30493054        else if (::strcmp(name, "slc")==0)
    3050             haveSlc = true;
     3055            good &= parseModEnable(asmr, linePtr, haveSlc, "slc modifier");
    30513056        else if (::strcmp(name, "unorm")==0)
    3052             haveUnorm = true;
     3057            good &= parseModEnable(asmr, linePtr, haveUnorm, "unorm modifier");
    30533058        else
    30543059        {
     
    32723277        toLowerString(name);
    32733278        if (name[0]=='v' && name[1]=='m' && name[2]==0)
    3274             haveVM = true;
     3279            good &= parseModEnable(asmr, linePtr, haveVM, "vm modifier");
    32753280        else if (::strcmp(name, "done")==0)
    3276             haveDone = true;
     3281            good &= parseModEnable(asmr, linePtr, haveDone, "done modifier");
    32773282        else if (::strcmp(name, "compr")==0)
    3278             haveCompr = true;
     3283            good &= parseModEnable(asmr, linePtr, haveCompr, "compr modifier");
    32793284        else
    32803285        {
     
    33923397        }
    33933398        if (::strcmp(name, "tfe") == 0)
    3394             haveTfe = true;
     3399            good &= parseModEnable(asmr, linePtr, haveTfe, "tfe modifier");
    33953400        else if (::strcmp(name, "glc") == 0)
    3396             haveGlc = true;
     3401            good &= parseModEnable(asmr, linePtr, haveGlc, "glc modifier");
    33973402        else if (::strcmp(name, "slc") == 0)
    3398             haveSlc = true;
     3403            good &= parseModEnable(asmr, linePtr, haveSlc, "slc modifier");
    33993404        else
    34003405        {
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc11.cpp

    r3051 r3088  
    592592    { " fla=%v154;   v_add_f32  fla, s21, v107", 0x0734d615U, 0, false, true, "" },
    593593    { "    v_add_f32  v154, v21, v107 vop3", 0xd206009aU, 0x0002d715U, true, true, "" },
     594    { "    v_add_f32  v154, v21, v107 vop3:1", 0xd206009aU, 0x0002d715U, true, true, "" },
    594595    { "    v_add_f32_e64  v154, v21, v107", 0xd206009aU, 0x0002d715U, true, true, "" },
     596    { "    v_add_f32_e64  v154, v21, v107 vop3:0",
     597        0xd206009aU, 0x0002d715U, true, true, "" },
    595598    { "    v_add_f32  v154, v21, s98", 0xd206009aU, 0x0000c515U, true, true, "" },
    596599    { "    v_add_f32  v154, abs(v21), v107", 0xd206019aU, 0x0002d715U, true, true, "" },
     
    606609        0xd206039aU, 0x6002d715U, true, true, "" },
    607610    { "    v_add_f32  v154, v21, v107 mul:2", 0xd206009aU, 0x0802d715U, true, true, "" },
     611    { "    v_add_f32  v154, v21, v107 mul:2 clamp:0",
     612        0xd206009aU, 0x0802d715U, true, true, "" },
    608613    { "    v_add_f32  v154, v21, v107 mul:002", 0xd206009aU, 0x0802d715U, true, true, "" },
    609614    { "    v_add_f32  v154, v21, v107 mul:4", 0xd206009aU, 0x1002d715U, true, true, "" },
     
    611616    { "    v_add_f32  v154, v21, v107 div:002", 0xd206009aU, 0x1802d715U, true, true, "" },
    612617    { "    v_add_f32  v154, v21, v107 mul:2 clamp",
     618        0xd206089aU, 0x0802d715U, true, true, "" },
     619    { "    v_add_f32  v154, v21, v107 mul:2 clamp:1",
    613620        0xd206089aU, 0x0802d715U, true, true, "" },
    614621    { "    v_add_f32  v154, v21, v107 clamp", 0xd206089aU, 0x0002d715U, true, true, "" },
     
    18051812    /* DS encoding */
    18061813    { "   ds_add_u32  v71, v169 offset:52583", 0xd800cd67U, 0x0000a947U, true, true, "" },
     1814    { "   ds_add_u32  v71, v169 offset:52583 gds:0",
     1815            0xd800cd67U, 0x0000a947U, true, true, "" },
    18071816    { "   ds_add_u32  v71, v169   ", 0xd8000000U, 0x0000a947U, true, true, "" },
    18081817    { "   ds_add_u32_e64  v71, v169   ", 0xd8000000U, 0x0000a947U, true, true, "" },
     
    18151824        0xd8000305U, 0x0000a947U, true, true, "" },
    18161825    { "   ds_add_u32  v71, v169 gds", 0xd8020000U, 0x0000a947U, true, true, "" },
     1826    { "   ds_add_u32  v71, v169 gds:1", 0xd8020000U, 0x0000a947U, true, true, "" },
    18171827    { "   ds_consume  v155 offset:52583", 0xd8f4cd67U, 0x9b000000U, true, true, "" },
    18181828    { "   ds_wrxchg2st64_rtn_b64 v[139:142], v71, v[169:170], v[86:87]"
     
    20852095    { "    buffer_load_format_x  v[61:62], v[18:19], s[80:83], s35 "
    20862096        "offset:603 glc slc addr64 tfe", 0xe000c25bU, 0x23d43d12U, true, true, "" },
     2097    { "    buffer_load_format_x  v[61:62], v[18:19], s[80:83], s35 "
     2098        "offset:603 glc slc addr64 tfe:1", 0xe000c25bU, 0x23d43d12U, true, true, "" },
     2099    { "    buffer_load_format_x  v[61:62], v[18:19], s[80:83], s35 "
     2100        "offset:603 glc slc:1 addr64 tfe:1", 0xe000c25bU, 0x23d43d12U, true, true, "" },
    20872101    { "    buffer_load_format_x  v[61:62], s[80:83], s35 "
    20882102        "offset:603 glc slc tfe", 0xe000425bU, 0x23d43d00U, true, true, "" },
     2103    { "    buffer_load_format_x  v[61:62], s[80:83], s35 "
     2104        "offset:603 glc:1 slc:1 tfe:1 addr64:0 lds:0",
     2105        0xe000425bU, 0x23d43d00U, true, true, "" },
    20892106    { "    buffer_load_format_x  v[61:62], off, s[80:83], s35 "
    20902107        "offset:603 glc slc tfe", 0xe000425bU, 0x23d43d00U, true, true, "" },
     
    20932110    { "    buffer_load_format_x  v61, v[18:19], s[80:83], s35 "
    20942111        "offset:603 glc slc addr64 lds", 0xe001c25bU, 0x23543d12U, true, true, "" },
     2112    { "    buffer_load_format_x  v61, v[18:19], s[80:83], s35 "
     2113        "offset:603 glc:1 slc:1 addr64:1 lds:1", 0xe001c25bU, 0x23543d12U, true, true, "" },
    20952114    { "    buffer_load_format_x  v[61:62], v[18:19], s[80:83], s35 "
    20962115        "offset:603 glc slc addr64 lds tfe", 0, 0, false, false,
     
    24652484    { "    image_load  v157, v[121:124], s[84:87] dmask:1 unorm glc slc r128 lwe da",
    24662485        0xf202f100U, 0x00159d79U, true, true, "" },
     2486    { "    image_load  v157, v[121:124], s[84:87] "
     2487        "dmask:1 unorm:1 glc:1 slc:1 r128:1 lwe:1 da:1",
     2488        0xf202f100U, 0x00159d79U, true, true, "" },
    24672489    { "    image_load  v157, v[121:124], s[84:87] dmask:2 unorm glc slc r128 lwe da",
    24682490        0xf202f200U, 0x00159d79U, true, true, "" },
     
    25072529        0xf0020100U, 0x00159d79U, true, true, "" },
    25082530    { "    image_load  v157, v[121:124], s[84:91] slc",
     2531        0xf2000100U, 0x00159d79U, true, true, "" },
     2532    { "    image_load  v157, v[121:124], s[84:91] unorm:0 glc:0 da:0 r128:0 tfe:0 lwe:0",
     2533        0xf0000100U, 0x00159d79U, true, true, "" },
     2534    { "    image_load  v157, v[121:124], s[84:91] unorm:1 glc:0 da:0 r128:0 tfe:0 lwe:0",
     2535        0xf0001100U, 0x00159d79U, true, true, "" },
     2536    { "    image_load  v157, v[121:124], s[84:91] unorm:0 glc:1 da:0 r128:0 tfe:0 lwe:0",
     2537        0xf0002100U, 0x00159d79U, true, true, "" },
     2538    { "    image_load  v157, v[121:124], s[84:91] unorm:0 glc:0 da:1 r128:0 tfe:0 lwe:0",
     2539        0xf0004100U, 0x00159d79U, true, true, "" },
     2540    { "    image_load  v157, v[121:124], s[84:87] unorm:0 glc:0 da:0 r128:1 tfe:0 lwe:0",
     2541        0xf0008100U, 0x00159d79U, true, true, "" },
     2542    { "    image_load  v[157:158], v[121:124], s[84:91] "
     2543        "unorm:0 glc:0 da:0 r128:0 tfe:1 lwe:0",
     2544        0xf0010100U, 0x00159d79U, true, true, "" },
     2545    { "    image_load  v157, v[121:124], s[84:91] unorm:0 glc:0 da:0 r128:0 tfe:0 lwe:1",
     2546        0xf0020100U, 0x00159d79U, true, true, "" },
     2547    { "    image_load  v157, v[121:124], s[84:91] unorm:0 glc:0 da:0 r128:0 tfe:0 slc:1",
    25092548        0xf2000100U, 0x00159d79U, true, true, "" },
    25102549    /* MIMG errors */
     
    27612800    { "exp  mrt0, v116, v116, v93, v93 done compr vm",
    27622801        0xf8001c0fU, 0x00005d74U, true, true, "" },
     2802    { "exp  param5, v116, v93, v27, v124 done:1 compr:0 vm:0",
     2803        0xf8000a5fU, 0x7c1b5d74U, true, true, "" },
     2804    { "exp  mrt0, v116, v116, v93, v93 done:1 compr:1 vm:1",
     2805        0xf8001c0fU, 0x00005d74U, true, true, "" },
     2806    { "exp  param5, v116, v93, v27, v124 done:0 compr:0 vm:0",
     2807        0xf800025fU, 0x7c1b5d74U, true, true, "" },
     2808    { "exp  param5, v116, v93, v27, v124 done:0 compr:0 vm:1",
     2809        0xf800125fU, 0x7c1b5d74U, true, true, "" },
    27632810    /* EXP encoding src enables */
    27642811    { "exp  param5, v116, v93, v27, off done", 0xf8000a57U, 0x001b5d74U, true, true, "" },
     
    28852932    { "flat_load_ubyte v47, v[187:188] glc slc",
    28862933        0xdc230000U, 0x2f0000bbU, true, true, "" },
     2934    { "flat_load_ubyte v[47:48], v[187:188] glc:1 slc:1 tfe:1",
     2935        0xdc230000U, 0x2f8000bbU, true, true, "" },
     2936    { "flat_load_ubyte v47, v[187:188] glc:1 slc:1 tfe:0",
     2937        0xdc230000U, 0x2f0000bbU, true, true, "" },
    28872938    { "flat_load_ubyte v47, v[187:188] glc", 0xdc210000U, 0x2f0000bbU, true, true, "" },
     2939    { "flat_load_ubyte v47, v[187:188] glc:1 slc:0 tfe:0",
     2940        0xdc210000U, 0x2f0000bbU, true, true, "" },
    28882941    { "flat_load_ubyte v47, v[187:188] glc   ", 0xdc210000U, 0x2f0000bbU, true, true, "" },
    28892942    { "flat_load_ubyte v47, v[187:188]", 0xdc200000U, 0x2f0000bbU, true, true, "" },
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc12.cpp

    r3052 r3088  
    465465    /* VOP_DPP errors */
    466466    { "   v_cndmask_b32  v154, v190, v107, vcc quad_perm:[2,,0,3]", 0, 0, false, false,
    467         "test.s:1:54: Error: Missing number\n" },
     467        "test.s:1:54: Error: Expected expression\n" },
    468468    { "   v_cndmask_b32  v154, v190, v107, vcc quad_perm:[2,1,0,3  ", 0, 0, false, false,
    469469        "test.s:1:61: Error: Unterminated quad_perm\n" },
     
    10871087    { "   v_interp_p1_f32 v42, v16, attr39.z vop3",
    10881088        0xd270002aU, 0x000220a7U, true, true, "" },
     1089    { "a=1; b=0;   v_interp_p1_f32 v42, v16, attr39.z vop3:a high:b",
     1090        0xd270002aU, 0x000220a7U, true, true, "" },
    10891091    { "   v_interp_p1_f32 v42, v16, attr39.z high",
     1092        0xd270002aU, 0x000221a7U, true, true, "" },
     1093    { "   v_interp_p1_f32 v42, v16, attr39.z high:1",
    10901094        0xd270002aU, 0x000221a7U, true, true, "" },
    10911095    { "    v_interp_p2_f32 v42, v22, attr39.z vop3",
     
    13611365    { "image_load  v[157:160], v[121:124], s[84:87] dmask:11 unorm glc slc r128 "
    13621366        "tfe lwe da", 0xf203fb00U, 0x00159d79U, true, true, "" },
     1367    { "image_load  v[157:160], v[121:124], s[84:87] dmask:11 unorm glc slc r128 "
     1368        "tfe lwe da d16:0", 0xf203fb00U, 0x00159d79U, true, true, "" },
    13631369    { "    image_load  v157, v[121:124], s[84:91] d16",
     1370        0xf0000100U, 0x80159d79U, true, true, "" },
     1371    { "    image_load  v157, v[121:124], s[84:91] d16:1",
    13641372        0xf0000100U, 0x80159d79U, true, true, "" },
    13651373    { "    image_load_mip  v[157:159], v[121:124], s[84:87] dmask:11 unorm glc r128 da",
Note: See TracChangeset for help on using the changeset viewer.