Changeset 3082 in CLRX


Ignore:
Timestamp:
May 27, 2017, 3:57:10 PM (19 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Tentative support VEGA modifiers for SMEM. Fixed checking range for DS offset.

Location:
CLRadeonExtender/trunk
Files:
4 edited

Legend:

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

    r3053 r3082  
    6666    GCNTGT_SMEMOFFSET,
    6767    GCNTGT_SOPCIMM8,
    68     GCNTGT_SMEMIMM
     68    GCNTGT_SMEMIMM,
     69    GCNTGT_SMEMIMM2 // RXVEGA first soffset
    6970};
    7071
  • CLRadeonExtender/trunk/amdasm/GCNAsmHelpers.cpp

    r3077 r3082  
    753753            return false;
    754754        }
    755         asmr.printWarningForRange(bits, value, asmr.getSourcePos(exprPlace), signess);
    756         outValue = value & ((1ULL<<bits)-1ULL);
     755        if (bits != UINT_MAX)
     756        {
     757            asmr.printWarningForRange(bits, value,
     758                            asmr.getSourcePos(exprPlace), signess);
     759            outValue = value & ((1ULL<<bits)-1ULL);
     760        }
     761        else // just copy
     762            outValue = value;
    757763        return true;
    758764    }
  • CLRadeonExtender/trunk/amdasm/GCNAsmInternals.h

    r3056 r3082  
    178178                   bool required = true, Flags flags = INSTROP_SYMREGRANGE);
    179179   
     180    // bits=UINT_MAX - no range checking
    180181    /* return true if no error */
    181182    static bool parseImmInt(Assembler& asmr, const char*& linePtr, uint32_t& value,
  • CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp

    r3081 r3082  
    12181218    RegRange soffsetReg(0, 0);
    12191219    uint32_t soffsetVal = 0;
     1220    cxbyte soffsetVal2 = 0;
    12201221    std::unique_ptr<AsmExpression> soffsetExpr;
    12211222    std::unique_ptr<AsmExpression> simm7Expr;
     1223    std::unique_ptr<AsmExpression> soffset2Expr;
    12221224    const uint16_t mode1 = (gcnInsn.mode & GCN_MASK1);
     1225   
     1226    const char* soffsetPlace = nullptr;
    12231227   
    12241228    if (mode1 == GCN_SMRD_ONLYDST)
     
    12621266        {   // parse immediate
    12631267            soffsetReg.start = 255; // indicate an immediate
    1264             good &= parseImm(asmr, linePtr, soffsetVal, &soffsetExpr, 20, WS_UNSIGNED);
     1268            skipSpacesToEnd(linePtr, end);
     1269            soffsetPlace = linePtr;
     1270            good &= parseImm(asmr, linePtr, soffsetVal, &soffsetExpr,
     1271                // for VEGA we check range later
     1272                (arch & ARCH_RXVEGA) ? UINT_MAX : 20, WS_UNSIGNED);
    12651273        }
    12661274    }
    12671275    bool haveGlc = false;
     1276    bool haveNv = false;
    12681277    // modifiers
    12691278    while (linePtr != end)
     
    12791288            if (::strcmp(name, "glc")==0)
    12801289                haveGlc = true;
     1290            else if ((arch & ARCH_RXVEGA)!=0 && ::strcmp(name, "nv")==0)
     1291                haveNv = true;
     1292            else if (::strcmp(name, "offset")==0)
     1293            {
     1294                /*if (parseModImm(asmr, linePtr, soffset2Val, &soffset2Expr, "offset",
     1295                        WS_UNSIGNED))
     1296                {
     1297                    if (haveOffset)
     1298                        asmr.printWarning(modPlace, "Offset is already defined");
     1299                    haveOffset = true;
     1300                }
     1301                else
     1302                    good = false;*/
     1303            }
    12811304            else
    12821305            {
     
    13281351    SLEV(words[0], 0xc0000000U | (uint32_t(gcnInsn.code1)<<18) | (dataReg.bstart()<<6) |
    13291352            (sbaseReg.bstart()>>1) | ((soffsetReg.isVal(255)) ? 0x20000 : 0) |
    1330             (haveGlc ? 0x10000 : 0));
    1331     SLEV(words[1], ((soffsetReg.isVal(255)) ? soffsetVal : soffsetReg.bstart()));
     1353            (haveGlc ? 0x10000 : 0) | (haveNv ? 0x8000 : 0));
     1354    SLEV(words[1], ((soffsetReg.isVal(255)) ?
     1355                (soffsetVal | (uint32_t(soffsetVal2)<<24)) : soffsetReg.bstart()));
    13321356   
    13331357    output.insert(output.end(), reinterpret_cast<cxbyte*>(words),
     
    23852409            if (::strcmp(name, "offset") == 0)
    23862410            {
    2387                 if (parseModImm(asmr, linePtr, offset, &offsetExpr, "offset", WS_UNSIGNED))
     2411                if (parseModImm(asmr, linePtr, offset, &offsetExpr, "offset",
     2412                            0, WS_UNSIGNED))
    23882413                {
    23892414                    if (haveOffset)
Note: See TracChangeset for help on using the changeset viewer.