Changeset 3109 in CLRX


Ignore:
Timestamp:
May 31, 2017, 7:59:06 AM (17 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GNAsm: Add SCRATCH mode to FLAT encoding and its instructions (AMD VEGA arch).

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r3108 r3109  
    6969    GCNTGT_SMEMOFFSETVEGA,
    7070    GCNTGT_SMEMOFFSET2, // RXVEGA first soffset
    71     GCNTGT_INSTOFFSET
     71    GCNTGT_INSTOFFSET,
     72    GCNTGT_INSTOFFSET_S
    7273};
    7374
     
    486487    GCNFIELD_FLAT_VDSTLAST,
    487488    GCNFIELD_DPPSDWA_SRC0,
    488     GCNFIELD_DPPSDWA_SSRC0
     489    GCNFIELD_DPPSDWA_SSRC0,
     490    GCNFIELD_FLAT_SADDR
    489491};
    490492
  • CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp

    r3108 r3109  
    35053505    }
    35063506    const bool isGCN14 = (arch & ARCH_RXVEGA)!=0;
     3507    const cxuint flatMode = (gcnInsn.mode & GCN_FLAT_MODEMASK);
    35073508    bool good = true;
    35083509    RegRange vaddrReg(0, 0);
    35093510    RegRange vdstReg(0, 0);
    35103511    RegRange vdataReg(0, 0);
     3512    RegRange saddrReg(0, 0);
    35113513    GCNAssembler* gcnAsm = static_cast<GCNAssembler*>(asmr.isaAssembler);
    35123514   
     
    35143516    const char* vdstPlace = nullptr;
    35153517   
     3518    bool vaddrOff = false;
    35163519    const cxuint dregsNum = ((gcnInsn.mode&GCN_DSIZE_MASK)>>GCN_SHIFT2)+1;
    35173520    if ((gcnInsn.mode & GCN_FLAT_ADST) == 0)
     
    35243527        if (!skipRequiredComma(asmr, linePtr))
    35253528            return false;
    3526         gcnAsm->setCurrentRVU(1);
    3527         good &= parseVRegRange(asmr, linePtr, vaddrReg, 2, GCNFIELD_FLAT_ADDR, true,
     3529        skipSpacesToEnd(linePtr, end);
     3530        if (flatMode == GCN_FLAT_SCRATCH && linePtr+3<end &&
     3531            toLower(linePtr[0])=='o' && toLower(linePtr[1])=='f' &&
     3532            toLower(linePtr[2])=='f' && (linePtr+3==end || !isAlnum(linePtr[3])))
     3533        { // if off
     3534            vaddrOff = true;
     3535            linePtr+=3;
     3536        }
     3537        else
     3538        {
     3539            gcnAsm->setCurrentRVU(1);
     3540            good &= parseVRegRange(asmr, linePtr, vaddrReg,
     3541                    (flatMode != GCN_FLAT_SCRATCH ? 2 : 1), GCNFIELD_FLAT_ADDR, true,
     3542                    INSTROP_SYMREGRANGE|INSTROP_READ);
     3543        }
     3544    }
     3545    else
     3546    {
     3547        skipSpacesToEnd(linePtr, end);
     3548        if (flatMode == GCN_FLAT_SCRATCH && linePtr+3<end &&
     3549            toLower(linePtr[0])=='o' && toLower(linePtr[1])=='f' &&
     3550            toLower(linePtr[2])=='f' && (linePtr+3==end || !isAlnum(linePtr[3])))
     3551        { // if off
     3552            vaddrOff = true;
     3553            linePtr+=3;
     3554        }
     3555        else
     3556        {
     3557            gcnAsm->setCurrentRVU(1);
     3558            good &= parseVRegRange(asmr, linePtr, vaddrReg,
     3559                        (flatMode != GCN_FLAT_SCRATCH ? 2 : 1), GCNFIELD_FLAT_ADDR, true,
    35283560                        INSTROP_SYMREGRANGE|INSTROP_READ);
    3529     }
    3530     else
    3531     {
    3532         gcnAsm->setCurrentRVU(1);
    3533         good &= parseVRegRange(asmr, linePtr, vaddrReg, 2, GCNFIELD_FLAT_ADDR, true,
    3534                         INSTROP_SYMREGRANGE|INSTROP_READ);
     3561        }
    35353562        if ((gcnInsn.mode & GCN_FLAT_NODST) == 0)
    35363563        {
     
    35533580                               true, INSTROP_SYMREGRANGE|INSTROP_READ);
    35543581    }
     3582   
     3583    bool saddrOff = false;
     3584    if (flatMode != 0)
     3585    {   // SADDR
     3586        if (!skipRequiredComma(asmr, linePtr))
     3587            return false;
     3588        skipSpacesToEnd(linePtr, end);
     3589        if (flatMode != 0 && linePtr+3<end &&
     3590            toLower(linePtr[0])=='o' && toLower(linePtr[1])=='f' &&
     3591            toLower(linePtr[2])=='f' && (linePtr+3==end || !isAlnum(linePtr[3])))
     3592        { // if off
     3593            saddrOff = true;
     3594            linePtr+=3;
     3595        }
     3596        else
     3597        {
     3598            gcnAsm->setCurrentRVU(3);
     3599            good &= parseSRegRange(asmr, linePtr, saddrReg, arch,
     3600                        (flatMode==GCN_FLAT_SCRATCH ? 1 : 2), GCNFIELD_FLAT_SADDR, true,
     3601                        INSTROP_SYMREGRANGE|INSTROP_READ);
     3602        }
     3603    }
     3604   
     3605    if (flatMode == GCN_FLAT_SCRATCH && !saddrOff && !vaddrOff)
     3606    {
     3607        asmr.printError(instrPlace, "Only one of VADDR and SADDR can be set in "
     3608                    "SCRATCH mode");
     3609        good = false;
     3610    }
     3611   
     3612    if (saddrOff)
     3613        saddrReg.start = 0xff;
     3614    if (vaddrOff)
     3615        vaddrReg.start = 0xff;
    35553616   
    35563617    uint16_t instOffset = 0;
     
    35833644        {
    35843645            if (parseModImm(asmr, linePtr, instOffset, &instOffsetExpr, "inst_offset",
    3585                             12, WS_UNSIGNED))
     3646                            flatMode!=0 ? 13 : 12, flatMode!=0 ? WS_BOTH : WS_UNSIGNED))
    35863647            {
    35873648                if (haveInstOffset)
     
    36373698   
    36383699    if (instOffsetExpr!=nullptr)
    3639         instOffsetExpr->setTarget(AsmExprTarget(GCNTGT_INSTOFFSET, asmr.currentSection,
     3700        instOffsetExpr->setTarget(AsmExprTarget(flatMode!=0 ?
     3701                    GCNTGT_INSTOFFSET_S : GCNTGT_INSTOFFSET, asmr.currentSection,
    36403702                    output.size()));
    36413703   
    36423704    uint32_t words[2];
    36433705    SLEV(words[0], 0xdc000000U | (haveGlc ? 0x10000 : 0) | (haveSlc ? 0x20000: 0) |
    3644             (uint32_t(gcnInsn.code1)<<18) | (haveLds ? 0x2000U : 0) | instOffset);
    3645     SLEV(words[1], (vaddrReg.start&0xff) | (uint32_t(vdataReg.start&0xff)<<8) |
    3646             (haveTfe|haveNv ? (1U<<23) : 0) | (uint32_t(vdstReg.start&0xff)<<24));
     3706            (uint32_t(gcnInsn.code1)<<18) | (haveLds ? 0x2000U : 0) | instOffset |
     3707            (uint32_t(flatMode)<<14));
     3708    SLEV(words[1], (vaddrReg.bstart()&0xff) | (uint32_t(vdataReg.bstart()&0xff)<<8) |
     3709            (haveTfe|haveNv ? (1U<<23) : 0) | (uint32_t(vdstReg.bstart()&0xff)<<24) |
     3710            (uint32_t(saddrReg.bstart())<<16));
    36473711   
    36483712    output.insert(output.end(), reinterpret_cast<cxbyte*>(words),
     
    39374001            sectionData[offset+1] = (sectionData[offset+1]&0xf0) | ((value&0xf00)>>8);
    39384002            printWarningForRange(12, value, sourcePos, WS_UNSIGNED);
     4003            return true;
     4004        case GCNTGT_INSTOFFSET_S:
     4005            if (sectionId != ASMSECT_ABS)
     4006            {
     4007                printError(sourcePos, "Relative value is illegal in offset expressions");
     4008                return false;
     4009            }
     4010            sectionData[offset] = value;
     4011            sectionData[offset+1] = (sectionData[offset+1]&0xe0) |
     4012                    ((value&0x1f00)>>8);
     4013            printWarningForRange(13, value, sourcePos, WS_BOTH);
    39394014            return true;
    39404015        default:
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc14.cpp

    r3108 r3109  
    658658    { "flat_load_short_d16_hi " "v47, v[187:188] glc slc nv\n",
    659659        0xdc970000U, 0x2f8000bbU, true, true, "" },
     660    /* FLAT SCRATCH encoding */
     661    { "scratch_load_ubyte v47, off, s49 glc slc\n",
     662        0xdc434000U, 0x2f3100ffU, true, true, "" },
     663    { "scratch_load_ubyte v47, v187, off glc slc\n",
     664        0xdc434000U, 0x2fff00bbU, true, true, "" },
     665    { "scratch_load_ubyte v47, v187, off inst_offset:1043 glc slc\n",
     666        0xdc434413U, 0x2fff00bbU, true, true, "" },
     667    { "scratch_load_ubyte v47, v187, off inst_offset:zz glc slc\nzz=1043\n",
     668        0xdc434413U, 0x2fff00bbU, true, true, "" },
     669    { "scratch_load_ubyte v47, v187, off inst_offset:-3053 glc slc\n",
     670        0xdc435413U, 0x2fff00bbU, true, true, "" },
     671    { "scratch_load_ubyte v47, v187, off inst_offset:zz glc slc\nzz=-3053\n",
     672        0xdc435413U, 0x2fff00bbU, true, true, "" },
     673    { "scratch_load_ubyte v47, v187, off inst_offset:-4096 glc slc\n",
     674        0xdc435000U, 0x2fff00bbU, true, true, "" },
     675    { "scratch_load_ubyte v47, v187, off inst_offset:zzx glc slc\nzzx=-4096\n",
     676        0xdc435000U, 0x2fff00bbU, true, true, "" },
     677    /* FLAT SCRATCH instructions */
     678    { "scratch_load_sbyte v47, off, s49 glc slc\n",
     679        0xdc474000U, 0x2f3100ffU, true, true, "" },
     680    { "scratch_load_ushort v47, off, s49 glc slc\n",
     681        0xdc4b4000U, 0x2f3100ffU, true, true, "" },
     682    { "scratch_load_sshort v47, off, s49 glc slc\n",
     683        0xdc4f4000U, 0x2f3100ffU, true, true, "" },
     684    { "scratch_load_dword v47, off, s49 glc slc\n",
     685        0xdc534000U, 0x2f3100ffU, true, true, "" },
     686    { "scratch_load_dwordx2 v[47:48], off, s49 glc slc\n",
     687        0xdc574000U, 0x2f3100ffU, true, true, "" },
     688    { "scratch_load_dwordx3 v[47:49], off, s49 glc slc\n",
     689        0xdc5b4000U, 0x2f3100ffU, true, true, "" },
     690    { "scratch_load_dwordx4 v[47:50], off, s49 glc slc\n",
     691        0xdc5f4000U, 0x2f3100ffU, true, true, "" },
     692    { "scratch_store_byte off, v65, s49 glc slc\n",
     693        0xdc634000U, 0x003141ffU, true, true, "" },
     694    { "scratch_store_byte_d16_hi off, v65, s49 glc slc\n",
     695        0xdc674000U, 0x003141ffU, true, true, "" },
     696    { "scratch_store_short off, v65, s49 glc slc\n",
     697        0xdc6b4000U, 0x003141ffU, true, true, "" },
     698    { "scratch_store_short_d16_hi off, v65, s49 glc slc\n",
     699        0xdc6f4000U, 0x003141ffU, true, true, "" },
     700    { "scratch_store_dword off, v65, s49 glc slc\n",
     701        0xdc734000U, 0x003141ffU, true, true, "" },
     702    { "scratch_store_dwordx2 off, v[65:66], s49 glc slc\n",
     703        0xdc774000U, 0x003141ffU, true, true, "" },
     704    { "scratch_store_dwordx3 off, v[65:67], s49 glc slc\n",
     705        0xdc7b4000U, 0x003141ffU, true, true, "" },
     706    { "scratch_store_dwordx4 off, v[65:68], s49 glc slc\n",
     707        0xdc7f4000U, 0x003141ffU, true, true, "" },
     708    { "scratch_load_ubyte_d16 v47, off, s49 glc slc\n",
     709        0xdc834000U, 0x2f3100ffU, true, true, "" },
     710    { "scratch_load_ubyte_d16_hi v47, off, s49 glc slc\n",
     711        0xdc874000U, 0x2f3100ffU, true, true, "" },
     712    { "scratch_load_sbyte_d16 v47, off, s49 glc slc\n",
     713        0xdc8b4000U, 0x2f3100ffU, true, true, "" },
     714    { "scratch_load_sbyte_d16_hi v47, off, s49 glc slc\n",
     715        0xdc8f4000U, 0x2f3100ffU, true, true, "" },
     716    { "scratch_load_short_d16 v47, off, s49 glc slc\n",
     717        0xdc934000U, 0x2f3100ffU, true, true, "" },
     718    { "scratch_load_short_d16_hi v47, off, s49 glc slc\n",
     719        0xdc974000U, 0x2f3100ffU, true, true, "" },
    660720    { nullptr, 0, 0, false, false, 0 }
    661721};
Note: See TracChangeset for help on using the changeset viewer.