Changeset 3100 in CLRX


Ignore:
Timestamp:
May 29, 2017, 6:35:17 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Full support for OMOD and SGPR mode for SRC0 and SRC1 in SDWA encoding (AMD VEGA arch).

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3099 r3100  
    15351535                ((opMods.sextMod&2) ? VOPOP_SEXT : 0);
    15361536   
    1537     // TODO: to modify or delete
    15381537    extraMods.needSDWA |= ((src0Op.vopMods | src1Op.vopMods) & VOPOP_SEXT) != 0;
    15391538    bool vop3 = /* src1=sgprs and not (DS1_SGPR|src1_SGPR) */
     
    17921791                ((opMods.sextMod&1) ? VOPOP_SEXT : 0);
    17931792   
     1793    extraMods.needSDWA |= ((src0Op.vopMods) & VOPOP_SEXT) != 0;
     1794   
    17941795    bool vop3 = ((!isGCN12 && src0Op.vopMods!=0) ||
    17951796            (modifiers&~(VOP3_BOUNDCTRL|(extraMods.needSDWA?VOP3_CLAMP:0)|
     
    17971798            ((isGCN14 && extraMods.needSDWA) ? 3 : 0)))!=0) ||
    17981799            (gcnEncSize==GCNEncSize::BIT64);
    1799    
    18001800    if (vop3) // modify fields in reg usage
    18011801    {
     
    19161916    const uint16_t mode2 = (gcnInsn.mode & GCN_MASK2);
    19171917    const bool isGCN12 = (arch & ARCH_GCN_1_2_4)!=0;
     1918    const bool isGCN14 = (arch & ARCH_RXVEGA)!=0;
    19181919   
    19191920    GCNAssembler* gcnAsm = static_cast<GCNAssembler*>(asmr.isaAssembler);
     
    19661967                ((opMods.sextMod&2) ? VOPOP_SEXT : 0);
    19671968   
     1969    extraMods.needSDWA |= ((src0Op.vopMods | src1Op.vopMods) & VOPOP_SEXT) != 0;
    19681970    bool vop3 = //(dstReg.start!=106) || (src1Op.range.start<256) ||
    1969         (!dstReg.isVal(106)) || (src1Op.range.isNonVGPR()) ||
     1971        (!dstReg.isVal(106)) ||
     1972        ((!isGCN14 || !extraMods.needSDWA) && src1Op.range.isNonVGPR()) ||
    19701973        (!isGCN12 && (src0Op.vopMods!=0 || src1Op.vopMods!=0)) ||
    1971         (modifiers&~(VOP3_BOUNDCTRL|(extraMods.needSDWA?VOP3_CLAMP:0)))!=0 ||
     1974        (modifiers&~(VOP3_BOUNDCTRL|(extraMods.needSDWA?VOP3_CLAMP:0)|
     1975            /* exclude OMOD if RXVEGA and SDWA used */
     1976            ((isGCN14 && extraMods.needSDWA) ? 3 : 0)))!=0 ||
    19721977        (gcnEncSize==GCNEncSize::BIT64);
    19731978   
     
    20052010            return false;
    20062011        gcnAsm->instrRVUs[1].regField = GCNFIELD_DPPSDWA_SRC0;
     2012       
     2013        if (extraMods.needSDWA && isGCN14)
     2014        {   // fix for extra type operand from SDWA
     2015            AsmRegVarUsage* rvus = gcnAsm->instrRVUs;
     2016            if (rvus[2].regField != ASMFIELD_NONE && src0Op.range.isNonVGPR())
     2017                rvus[2].regField = GCNFIELD_DPPSDWA_SSRC0;
     2018            if (rvus[3].regField != ASMFIELD_NONE)
     2019                rvus[3].regField = GCNFIELD_VOP_SSRC1;
     2020        }
    20072021    }
    20082022    else if (isGCN12 && ((src0Op.vopMods|src1Op.vopMods) & ~VOPOP_SEXT)!=0 && !sextFlags)
     
    20492063                    ((src1Op.vopMods&VOPOP_SEXT) ? (1U<<27) : 0) |
    20502064                    ((src1Op.vopMods&VOPOP_NEG) ? (1U<<28) : 0) |
    2051                     ((src1Op.vopMods&VOPOP_ABS) ? (1U<<29) : 0));
     2065                    ((src1Op.vopMods&VOPOP_ABS) ? (1U<<29) : 0) |
     2066                    (src0Op.range.isNonVGPR() ? (1U<<23) : 0) |
     2067                    (src1Op.range.isNonVGPR() ? (1U<<31) : 0) |
     2068                    ((modifiers & 3) << 14));
    20522069        else if (extraMods.needDPP)
    20532070            SLEV(words[wordsNum++], (src0Op.range.bstart()&0xff) | (extraMods.dppCtrl<<8) |
  • CLRadeonExtender/trunk/tests/amdasm/GCNAsmOpc14.cpp

    r3099 r3100  
    280280    { "v_add_f32   v154, sext(-abs(v65)), vcc_hi",
    281281        0x0334d6f9U, 0x863e0641U, true, true, "" },
     282    { "v_add_f32   v154, sext(-abs(s65)), v107",
     283        0x0334d6f9U, 0x06be0641U, true, true, "" },
     284    // VOP3 encoding
     285    { "v_writelane_b32 v55, v27, v90", 0xd28a0037U, 0x0002b51bU, true, true, "" },
     286    /* SDWA encoding VOP1 */
     287    { "v_mov_b32   v154, v61 dst_sel:byte0 src0_sel:byte0\n",
     288        0x7f3402f9U, 0x0000003dU, true, true, "" },
     289    { "v_mov_b32   v154, v61 dst_sel:byte0 src0_sel:byte0 div:2\n",
     290        0x7f3402f9U, 0x0000c03dU, true, true, "" },
     291    { "v_mov_b32   v154, s61 dst_sel:byte0 src0_sel:byte0\n",
     292        0x7f3402f9U, 0x0080003dU, true, true, "" },
     293    { "v_mov_b32   v154, sext(s61) dst_sel:byte0 src0_sel:byte0\n",
     294        0x7f3402f9U, 0x0088003dU, true, true, "" },
     295    { "v_mov_b32   v154, sext(s61) dst_sel:byte0 src0_sel:byte0 clamp\n",
     296        0x7f3402f9U, 0x0088203dU, true, true, "" },
     297    /* SDWA encoding VOPC */
     298    { "v_cmp_class_f32 vcc, v0, v107 mul:4 dst_sel:byte0 src0_sel:byte0 src1_sel:byte0",
     299        0x7c20d6f9U, 0x8000, true, true, "" },
     300    { "v_cmp_class_f32 vcc, v61, v107 dst_sel:byte0 src0_sel:byte0 src1_sel:byte0",
     301        0x7c20d6f9U, 0x3dU, true, true, "" },
     302    { "v_cmp_class_f32 vcc, v61, vcc_hi dst_sel:byte0 src0_sel:byte0 src1_sel:byte0",
     303        0x7c20d6f9U, 0x8000003dU, true, true, "" },
     304    { "v_cmp_class_f32 vcc, s61, v107 dst_sel:byte0 src0_sel:byte0 src1_sel:byte0\n",
     305        0x7c20d6f9U, 0x0080003dU, true, true, "" },
     306    { "v_cmp_class_f32 vcc, sext(-abs(v65)), v107 mul:2",
     307        0x7c20d6f9U, 0x063e4641U, true, true, "" },
     308    { "v_cmp_class_f32 vcc, sext(-abs(v65)), vcc_hi",
     309        0x7c20d6f9U, 0x863e0641U, true, true, "" },
     310    { "v_cmp_class_f32 vcc, sext(-abs(s65)), v107",
     311        0x7c20d6f9U, 0x06be0641U, true, true, "" },
    282312    { nullptr, 0, 0, false, false, 0 }
    283313};
Note: See TracChangeset for help on using the changeset viewer.