Ignore:
Timestamp:
May 29, 2017, 6:53:28 AM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Add parametrizable modifers: abs, neg, sext.

File:
1 edited

Legend:

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

    r3092 r3096  
    15171517    cxbyte modifiers = 0;
    15181518    VOPExtraModifiers extraMods{};
    1519     good &= parseVOPModifiers(asmr, linePtr, arch, modifiers,
     1519    VOPOpModifiers opMods{};
     1520    good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods,
    15201521                    (isGCN12) ? &extraMods : nullptr, !haveDstCC || isGCN12);
    15211522    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    15221523        return false;
     1524   
     1525    if (src0Op)
     1526        src0Op.vopMods |= ((opMods.absMod&1) ? VOPOP_ABS : 0) |
     1527                ((opMods.negMod&1) ? VOPOP_NEG : 0) |
     1528                ((opMods.sextMod&1) ? VOPOP_SEXT : 0);
     1529    if (src1Op)
     1530        src1Op.vopMods |= ((opMods.absMod&2) ? VOPOP_ABS : 0) |
     1531                ((opMods.negMod&2) ? VOPOP_NEG : 0) |
     1532                ((opMods.sextMod&2) ? VOPOP_SEXT : 0);
    15231533   
    15241534    bool vop3 = /* src1=sgprs and not (DS1_SGPR|src1_SGPR) */
     
    17491759    // modifiers
    17501760    VOPExtraModifiers extraMods{};
    1751     good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, (isGCN12)?&extraMods:nullptr,
    1752                   true, (mode1!=GCN_VOP_ARG_NONE) ? 2 : 0);
     1761    VOPOpModifiers opMods{};
     1762    good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods,
     1763                  (isGCN12)?&extraMods:nullptr, true, (mode1!=GCN_VOP_ARG_NONE) ? 2 : 0);
    17531764    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    17541765        return false;
     1766   
     1767    if (src0Op)
     1768        src0Op.vopMods |= ((opMods.absMod&1) ? VOPOP_ABS : 0) |
     1769                ((opMods.negMod&1) ? VOPOP_NEG : 0) |
     1770                ((opMods.sextMod&1) ? VOPOP_SEXT : 0);
    17551771   
    17561772    bool vop3 = ((!isGCN12 && src0Op.vopMods!=0) ||
     
    19031919    // modifiers
    19041920    VOPExtraModifiers extraMods{};
    1905     good &= parseVOPModifiers(asmr, linePtr, arch, modifiers,
     1921    VOPOpModifiers opMods{};
     1922    good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods,
    19061923                        (isGCN12)?&extraMods:nullptr, true);
    19071924    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    19081925        return false;
     1926   
     1927    if (src0Op)
     1928        src0Op.vopMods |= ((opMods.absMod&1) ? VOPOP_ABS : 0) |
     1929                ((opMods.negMod&1) ? VOPOP_NEG : 0) |
     1930                ((opMods.sextMod&1) ? VOPOP_SEXT : 0);
     1931    if (src1Op)
     1932        src1Op.vopMods |= ((opMods.absMod&2) ? VOPOP_ABS : 0) |
     1933                ((opMods.negMod&2) ? VOPOP_NEG : 0) |
     1934                ((opMods.sextMod&2) ? VOPOP_SEXT : 0);
    19091935   
    19101936    bool vop3 = //(dstReg.start!=106) || (src1Op.range.start<256) ||
     
    21912217    }
    21922218    // modifiers
     2219    VOPOpModifiers opMods{};
    21932220    if (mode2 != GCN_VOP3_VINTRP)
    2194         good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, nullptr,
     2221        good &= parseVOPModifiers(asmr, linePtr, arch, modifiers, opMods, nullptr,
    21952222                              isGCN12 || gcnInsn.encoding!=GCNENC_VOP3B);
    21962223    if (!good || !checkGarbagesAtEnd(asmr, linePtr))
    21972224        return false;
     2225   
     2226    if (src0Op)
     2227        src0Op.vopMods |= ((opMods.absMod&1) ? VOPOP_ABS : 0) |
     2228                ((opMods.negMod&1) ? VOPOP_NEG : 0) |
     2229                ((opMods.sextMod&1) ? VOPOP_SEXT : 0);
     2230    if (src1Op)
     2231        src1Op.vopMods |= ((opMods.absMod&2) ? VOPOP_ABS : 0) |
     2232                ((opMods.negMod&2) ? VOPOP_NEG : 0) |
     2233                ((opMods.sextMod&2) ? VOPOP_SEXT : 0);
     2234    if (src2Op)
     2235        src2Op.vopMods |= ((opMods.absMod&4) ? VOPOP_ABS : 0) |
     2236                ((opMods.negMod&4) ? VOPOP_NEG : 0);
    21982237   
    21992238    if (mode2 != GCN_VOP3_VINTRP)
Note: See TracChangeset for help on using the changeset viewer.