Changeset 4997 in CLRX


Ignore:
Timestamp:
Nov 15, 2019, 3:22:55 PM (2 months ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNDisasm: Add support for SMRD immediate 32-bit literal for offset if arch==GCN1.1. Some changes in assembler.

Location:
CLRadeonExtender/trunk
Files:
7 edited

Legend:

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

    r4967 r4997  
    910910    const char* end = asmr.line+asmr.lineSize;
    911911    bool good = true;
    912     if (gcnEncSize==GCNEncSize::BIT64)
     912    if (gcnEncSize==GCNEncSize::BIT64 && (arch & ARCH_HD7X00) != 0)
    913913        ASM_FAIL_BY_ERROR(instrPlace, "Only 32-bit size for SMRD encoding")
    914914    GCNAssembler* gcnAsm = static_cast<GCNAssembler*>(asmr.isaAssembler);
     
    917917    RegRange sbaseReg(0, 0);
    918918    RegRange soffsetReg(0, 0);
    919     cxbyte soffsetVal = 0;
     919    uint32_t soffsetVal = 0;
    920920    std::unique_ptr<AsmExpression> soffsetExpr;
    921921    const GCNInsnMode mode1 = (gcnInsn.mode & GCN_MASK1);
     
    961961            // parse immediate
    962962            soffsetReg.start = 255; // indicate an immediate
    963             good &= parseImm(asmr, linePtr, soffsetVal, &soffsetExpr, 0, WS_UNSIGNED);
     963            good &= parseImm(asmr, linePtr, soffsetVal, &soffsetExpr, 8, WS_UNSIGNED);
    964964        }
    965965    }
     
    974974                    cxbyte(gcnAsm->instrRVUs[0].rend - gcnAsm->instrRVUs[0].rstart),
    975975                    GCNDELOP_SMEMOP, GCNDELOP_NONE, gcnAsm->instrRVUs[0].rwFlags };
     976   
     977    const cxuint wordsNum = 1;
     978    if (!checkGCNEncodingSize(asmr, instrPlace, gcnEncSize, wordsNum))
     979        return false;
    976980   
    977981    if (soffsetExpr!=nullptr)
  • CLRadeonExtender/trunk/amdasm/GCNAssembler.cpp

    r4993 r4997  
    736736                    words++;
    737737            }
     738            else if (isGCN11 && encPart==0 && (insnCode&0x1ff)==0xff)
     739                words++;
    738740            else if ((!isGCN12 && gcnSize11Table[encPart] && (encPart != 7 || isGCN11)) ||
    739741                (isGCN12 && gcnSize12Table[encPart]))
  • CLRadeonExtender/trunk/amdasm/GCNDisasm.cpp

    r4877 r4997  
    395395                        pos++;
    396396                }
     397                else if (isGCN11 && encPart==0 && (insnCode&0x1ff)==0xff)
     398                    pos++;
    397399                else if ((!isGCN12 && gcnSize11Table[encPart] && (encPart != 7 || isGCN11)) ||
    398400                    (isGCN12 && gcnSize12Table[encPart]))
     
    752754                    }
    753755                }
     756                else if (isGCN11 && encPart==0 && (insnCode&0x1ff)==0xff)
     757                {
     758                    if (pos < codeWordsNum)
     759                        insnCode2 = ULEV(codeWords[pos++]);
     760                }
    754761                else if ((!isGCN124 && gcnSize11Table[encPart] && (encPart != 7 || isGCN11)) ||
    755762                    (isGCN124 && gcnSize12Table[encPart]))
     
    10541061                                  *gcnInsn, insnCode, insnCode2);
    10551062                    else
    1056                         GCNDisasmUtils::decodeSMRDEncoding(*this, spacesToAdd, curArchMask,
    1057                                   *gcnInsn, insnCode);
     1063                        GCNDisasmUtils::decodeSMRDEncoding(*this, pos, curReloc,
     1064                                spacesToAdd, curArchMask, *gcnInsn, insnCode, insnCode2);
    10581065                    break;
    10591066                case GCNENC_VOPC:
  • CLRadeonExtender/trunk/amdasm/GCNDisasmDecode.cpp

    r4849 r4997  
    113113 * relocIter, optional - if literal is optional (can be replaced by inline constant) */
    114114void GCNDisasmUtils::printLiteral(GCNDisassembler& dasm, size_t codePos,
    115           RelocIter& relocIter, uint32_t literal, FloatLitType floatLit, bool optional)
     115          RelocIter& relocIter, uint32_t literal, FloatLitType floatLit, bool optional,
     116          bool useSMRDLit)
    116117{
    117118    // if with relocation, just write
     
    121122    char* bufStart = output.reserve(50);
    122123    char* bufPtr = bufStart;
    123     if (optional && (int32_t(literal)<=64 && int32_t(literal)>=-16)) // use lit(...)
     124    if ((useSMRDLit && optional && literal <= 0xff) ||
     125        (!useSMRDLit && optional && (int32_t(literal)<=64 && int32_t(literal)>=-16)))
     126        // use lit(...)
    124127    {
    125128        // use lit() to force correct encoding (avoid constants)
     
    341344char* GCNDisasmUtils::decodeGCNOperand(GCNDisassembler& dasm, size_t codePos,
    342345              RelocIter& relocIter, cxuint op, cxuint regNum, GPUArchMask arch,
    343               uint32_t literal, FloatLitType floatLit)
     346              uint32_t literal, FloatLitType floatLit, bool useLit)
    344347{
    345348    FastOutputBuffer& output = dasm.output;
     
    347350    {
    348351        // if literal
    349         printLiteral(dasm, codePos, relocIter, literal, floatLit, true);
     352        printLiteral(dasm, codePos, relocIter, literal, floatLit, true, useLit);
    350353        return output.reserve(100);
    351354    }
     
    751754}
    752755
    753 void GCNDisasmUtils::decodeSMRDEncoding(GCNDisassembler& dasm, cxuint spacesToAdd,
    754              GPUArchMask arch, const GCNInstruction& gcnInsn, uint32_t insnCode)
     756void GCNDisasmUtils::decodeSMRDEncoding(GCNDisassembler& dasm,
     757             size_t codePos, RelocIter& relocIter, cxuint spacesToAdd,
     758             GPUArchMask arch, const GCNInstruction& gcnInsn, uint32_t insnCode,
     759             uint32_t literal)
    755760{
    756761    FastOutputBuffer& output = dasm.output;
     
    785790            bufPtr += itocstrCStyle(insnCode&0xff, bufPtr, 11, 16);
    786791        else // S register
    787             decodeGCNOperandNoLit(dasm, insnCode&0xff, 1, bufPtr, arch);
     792        {
     793            if ((arch & ARCH_RX2X0)==0) // if GCN 1.0
     794                decodeGCNOperandNoLit(dasm, insnCode&0xff, 1, bufPtr, arch);
     795            else
     796            {   // if GCN1.1
     797                output.forward(bufPtr-bufStart);
     798                bufPtr = bufStart = decodeGCNOperand(dasm, codePos, relocIter,
     799                            insnCode&0xff, 1, arch, literal, FLTLIT_NONE, true);
     800            }
     801        }
    788802        // set what is printed
    789803        useDst = true;
  • CLRadeonExtender/trunk/amdasm/GCNDisasmInternals.h

    r4833 r4997  
    4444    typedef GCNDisassembler::RelocIter RelocIter;
    4545    static void printLiteral(GCNDisassembler& dasm, size_t codePos, RelocIter& relocIter,
    46               uint32_t literal, FloatLitType floatLit, bool optional);
     46              uint32_t literal, FloatLitType floatLit, bool optional,
     47              bool useSRMDLit = false);
    4748    // decode GCN operand (version without literal)
    4849    static void decodeGCNOperandNoLit(GCNDisassembler& dasm, cxuint op, cxuint regNum,
     
    5152    static char* decodeGCNOperand(GCNDisassembler& dasm, size_t codePos,
    5253              RelocIter& relocIter, cxuint op, cxuint regNum, GPUArchMask arch,
    53               uint32_t literal = 0, FloatLitType floatLit = FLTLIT_NONE);
     54              uint32_t literal = 0, FloatLitType floatLit = FLTLIT_NONE,
     55              bool useSMRDLit = false);
    5456   
    5557    static void decodeSOPCEncoding(GCNDisassembler& dasm,
     
    7375             const GCNInstruction& gcnInsn, uint32_t insnCode, uint32_t literal);
    7476   
    75     static void decodeSMRDEncoding(GCNDisassembler& dasm, cxuint spacesToAdd,
    76             GPUArchMask arch, const GCNInstruction& gcnInsn, uint32_t insnCode);
     77    static void decodeSMRDEncoding(GCNDisassembler& dasm,
     78            size_t codePos, RelocIter& relocIter, cxuint spacesToAdd,
     79            GPUArchMask arch, const GCNInstruction& gcnInsn, uint32_t insnCode,
     80            uint32_t literal);
    7781   
    7882    static void decodeSMEMEncoding(GCNDisassembler& dasm, cxuint spacesToAdd,
  • CLRadeonExtender/trunk/amdbin/AmdCL2BinGen.cpp

    r4832 r4997  
    17801780                    }
    17811781                }
     1782                else if (isGCN11 && encPart==0 && (insnCode&0x1ff)==0xff)
     1783                {
     1784                    if (pos < codeWordsNum) pos++;
     1785                }
    17821786                else if ((!isGCN12 && gcnSize11Table[encPart] && (encPart != 7 || isGCN11)) ||
    17831787                    (isGCN12 && gcnSize12Table[encPart]))
  • CLRadeonExtender/trunk/tests/amdasm/GCNDisasmOpc11.cpp

    r4831 r4997  
    29852985    { 0xbf9a0029U, 0, false, "        s_cbranch_cdbgsys_and_user .L168_0\n" },
    29862986    /* SMRD encoding */
     2987    { 0xc219baffU, 0x13314, true, "        s_buffer_load_dword s51, s[58:61], 0x13314\n" },
     2988    { 0xc219baffU, 0xfd, true, "        s_buffer_load_dword s51, s[58:61], lit(253)\n" },
     2989    { 0xc219bbffU, 0, false, "        s_buffer_load_dword s51, s[58:61], 0xff\n" },
    29872990    { 0xc77ff023U, 0, false, "        s_dcache_inv_vol "
    29882991                "sdst=0x7f sbase=0x38 offset=0x23\n" },
Note: See TracChangeset for help on using the changeset viewer.