Changeset 3108 in CLRX


Ignore:
Timestamp:
May 30, 2017, 9:01:21 PM (19 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add new FLAT instructions and modifiers (AMD VEGA arch).

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r3099 r3108  
    6868    GCNTGT_SMEMIMM,
    6969    GCNTGT_SMEMOFFSETVEGA,
    70     GCNTGT_SMEMOFFSET2 // RXVEGA first soffset
     70    GCNTGT_SMEMOFFSET2, // RXVEGA first soffset
     71    GCNTGT_INSTOFFSET
    7172};
    7273
  • CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp

    r3107 r3108  
    35043504        return false;
    35053505    }
     3506    const bool isGCN14 = (arch & ARCH_RXVEGA)!=0;
    35063507    bool good = true;
    35073508    RegRange vaddrReg(0, 0);
     
    35533554    }
    35543555   
     3556    uint16_t instOffset = 0;
     3557    std::unique_ptr<AsmExpression> instOffsetExpr;
    35553558    bool haveTfe = false, haveSlc = false, haveGlc = false;
     3559    bool haveNv = false, haveLds = false, haveInstOffset = false;
    35563560    while(linePtr!=end)
    35573561    {
     
    35593563        if (linePtr==end)
    35603564            break;
    3561         char name[10];
     3565        char name[20];
    35623566        const char* modPlace = linePtr;
    3563         if (!getNameArgS(asmr, 10, name, linePtr, "FLAT modifier"))
     3567        if (!getNameArgS(asmr, 20, name, linePtr, "FLAT modifier"))
    35643568        {
    35653569            good = false;
    35663570            continue;
    35673571        }
    3568         if (::strcmp(name, "tfe") == 0)
     3572        if (!isGCN14 && ::strcmp(name, "tfe") == 0)
    35693573            good &= parseModEnable(asmr, linePtr, haveTfe, "tfe modifier");
     3574        else if (isGCN14 && ::strcmp(name, "nv") == 0)
     3575            good &= parseModEnable(asmr, linePtr, haveNv, "nv modifier");
     3576        else if (isGCN14 && ::strcmp(name, "lds") == 0)
     3577            good &= parseModEnable(asmr, linePtr, haveLds, "lds modifier");
    35703578        else if (::strcmp(name, "glc") == 0)
    35713579            good &= parseModEnable(asmr, linePtr, haveGlc, "glc modifier");
    35723580        else if (::strcmp(name, "slc") == 0)
    35733581            good &= parseModEnable(asmr, linePtr, haveSlc, "slc modifier");
     3582        else if (isGCN14 && ::strcmp(name, "inst_offset")==0)
     3583        {
     3584            if (parseModImm(asmr, linePtr, instOffset, &instOffsetExpr, "inst_offset",
     3585                            12, WS_UNSIGNED))
     3586            {
     3587                if (haveInstOffset)
     3588                    asmr.printWarning(modPlace, "InstOffset is already defined");
     3589                haveInstOffset = true;
     3590            }
     3591            else
     3592                good = false;
     3593        }
    35743594        else
    35753595        {
     
    36163636        return false;
    36173637   
     3638    if (instOffsetExpr!=nullptr)
     3639        instOffsetExpr->setTarget(AsmExprTarget(GCNTGT_INSTOFFSET, asmr.currentSection,
     3640                    output.size()));
     3641   
    36183642    uint32_t words[2];
    36193643    SLEV(words[0], 0xdc000000U | (haveGlc ? 0x10000 : 0) | (haveSlc ? 0x20000: 0) |
    3620             (uint32_t(gcnInsn.code1)<<18));
     3644            (uint32_t(gcnInsn.code1)<<18) | (haveLds ? 0x2000U : 0) | instOffset);
    36213645    SLEV(words[1], (vaddrReg.start&0xff) | (uint32_t(vdataReg.start&0xff)<<8) |
    3622             (haveTfe ? (1U<<23) : 0) | (uint32_t(vdstReg.start&0xff)<<24));
     3646            (haveTfe|haveNv ? (1U<<23) : 0) | (uint32_t(vdstReg.start&0xff)<<24));
    36233647   
    36243648    output.insert(output.end(), reinterpret_cast<cxbyte*>(words),
    36253649            reinterpret_cast<cxbyte*>(words + 2));
     3650   
     3651    instOffsetExpr.release();
    36263652    // update register pool
    36273653    if (vdstReg && !vdstReg.isRegVar() && (dstToWrite || haveTfe))
     
    39013927            sectionData[offset+1] = (sectionData[offset+1]&0xe0) | ((value>>2)&0x1f);
    39023928            printWarningForRange(7, value, sourcePos, WS_UNSIGNED);
     3929            return true;
     3930        case GCNTGT_INSTOFFSET:
     3931            if (sectionId != ASMSECT_ABS)
     3932            {
     3933                printError(sourcePos, "Relative value is illegal in offset expressions");
     3934                return false;
     3935            }
     3936            sectionData[offset] = value;
     3937            sectionData[offset+1] = (sectionData[offset+1]&0xf0) | ((value&0xf00)>>8);
     3938            printWarningForRange(12, value, sourcePos, WS_UNSIGNED);
    39033939            return true;
    39043940        default:
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc14.cpp

    r3107 r3108  
    633633    { "image_gather8h_pck v[157:160], v[121:124], s[84:91], s[0:3] dmask:11 "
    634634        "unorm glc a16 da\n", 0xf12cfb00U, 0x00159d79U, true, true, "" },
     635    /* FLAT encoding */
     636    { "flat_load_ubyte v47, v[187:188] nv\n", 0xdc400000U, 0x2f8000bbU, true, true, "" },
     637    { "flat_load_ubyte v47, v[187:188]\n", 0xdc400000U, 0x2f0000bbU, true, true, "" },
     638    { "flat_load_ubyte v47, v[187:188] lds\n", 0xdc402000U, 0x2f0000bbU, true, true, "" },
     639    { "flat_load_ubyte v47, v[187:188] inst_offset:529\n",
     640        0xdc400211U, 0x2f0000bbU, true, true, "" },
     641    { "flat_load_ubyte v47, v[187:188] inst_offset:zzz\nzzz=529\n",
     642        0xdc400211U, 0x2f0000bbU, true, true, "" },
     643    /* FLAT instructions */
     644    { "flat_store_byte_d16_hi " "v[187:188], v65 glc slc nv\n",
     645        0xdc670000U, 0x008041bbU, true, true, "" },
     646    { "flat_store_short_d16_hi " "v[187:188], v65 glc slc nv\n",
     647        0xdc6f0000U, 0x008041bbU, true, true, "" },
     648    { "flat_load_ubyte_d16 " "v47, v[187:188] glc slc nv\n",
     649        0xdc830000U, 0x2f8000bbU, true, true, "" },
     650    { "flat_load_ubyte_d16_hi " "v47, v[187:188] glc slc nv\n",
     651        0xdc870000U, 0x2f8000bbU, true, true, "" },
     652    { "flat_load_sbyte_d16 " "v47, v[187:188] glc slc nv\n",
     653        0xdc8b0000U, 0x2f8000bbU, true, true, "" },
     654    { "flat_load_sbyte_d16_hi " "v47, v[187:188] glc slc nv\n",
     655        0xdc8f0000U, 0x2f8000bbU, true, true, "" },
     656    { "flat_load_short_d16 " "v47, v[187:188] glc slc nv\n",
     657        0xdc930000U, 0x2f8000bbU, true, true, "" },
     658    { "flat_load_short_d16_hi " "v47, v[187:188] glc slc nv\n",
     659        0xdc970000U, 0x2f8000bbU, true, true, "" },
    635660    { nullptr, 0, 0, false, false, 0 }
    636661};
Note: See TracChangeset for help on using the changeset viewer.