Changeset 4085 in CLRX


Ignore:
Timestamp:
May 5, 2018, 9:49:03 AM (2 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNAsm: Simplify VOP2/VOP1/VOPC (as VOP3) encoding part (use encodeVOP3Words).

File:
1 edited

Legend:

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

    r4084 r4085  
    15051505}
    15061506
     1507static void encodeVOP3Words(bool isGCN12, const GCNAsmInstruction& gcnInsn,
     1508        cxbyte modifiers, VOPOpModifiers opMods, bool haveDstCC,
     1509        const RegRange& dstReg, const RegRange& dstCCReg, const RegRange& srcCCReg,
     1510        const GCNOperand& src0Op, const GCNOperand& src1Op,
     1511        cxuint& wordsNum, uint32_t* words)
     1512{
     1513    // VOP3 encoding
     1514    uint32_t code = (isGCN12) ?
     1515            (uint32_t(gcnInsn.code2)<<16) | ((modifiers&VOP3_CLAMP) ? 0x8000 : 0) :
     1516            (uint32_t(gcnInsn.code2)<<17) | ((modifiers&VOP3_CLAMP) ? 0x800 : 0);
     1517    if (haveDstCC) // if VOP3B
     1518        SLEV(words[0], 0xd0000000U | code |
     1519            (dstReg.bstart()&0xff) | (uint32_t(dstCCReg.bstart())<<8));
     1520    else // if VOP3A
     1521        SLEV(words[0], 0xd0000000U | code | (dstReg.bstart()&0xff) |
     1522            ((src0Op.vopMods & VOPOP_ABS) ? 0x100 : 0) |
     1523            ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0) |
     1524            ((opMods.opselMod&15) << 11));
     1525    // second dword
     1526    SLEV(words[1], src0Op.range.bstart() | (uint32_t(src1Op.range.bstart())<<9) |
     1527        (uint32_t(srcCCReg.bstart())<<18) | (uint32_t(modifiers & 3) << 27) |
     1528        ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0) |
     1529        ((src1Op.vopMods & VOPOP_NEG) ? (1U<<30) : 0));
     1530    wordsNum++;
     1531}
     1532
    15071533bool GCNAsmUtils::parseVOP2Encoding(Assembler& asmr, const GCNAsmInstruction& gcnInsn,
    15081534                  const char* instrPlace, const char* linePtr, uint16_t arch,
     
    17351761                0, wordsNum, words);
    17361762    else
    1737     {
    17381763        // VOP3 encoding
    1739         uint32_t code = (isGCN12) ?
    1740                 (uint32_t(gcnInsn.code2)<<16) | ((modifiers&VOP3_CLAMP) ? 0x8000 : 0) :
    1741                 (uint32_t(gcnInsn.code2)<<17) | ((modifiers&VOP3_CLAMP) ? 0x800 : 0);
    1742         if (haveDstCC) // if VOP3B
    1743             SLEV(words[0], 0xd0000000U | code |
    1744                 (dstReg.bstart()&0xff) | (uint32_t(dstCCReg.bstart())<<8));
    1745         else // if VOP3A
    1746             SLEV(words[0], 0xd0000000U | code | (dstReg.bstart()&0xff) |
    1747                 ((src0Op.vopMods & VOPOP_ABS) ? 0x100 : 0) |
    1748                 ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0) |
    1749                 ((opMods.opselMod&15) << 11));
    1750         // second dword
    1751         SLEV(words[1], src0Op.range.bstart() | (uint32_t(src1Op.range.bstart())<<9) |
    1752             (uint32_t(srcCCReg.bstart())<<18) | (uint32_t(modifiers & 3) << 27) |
    1753             ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0) |
    1754             ((src1Op.vopMods & VOPOP_NEG) ? (1U<<30) : 0));
    1755         wordsNum++;
    1756     }
     1764        encodeVOP3Words(isGCN12, gcnInsn, modifiers, opMods, haveDstCC,
     1765                dstReg, dstCCReg, srcCCReg, src0Op, src1Op, wordsNum, words);
     1766   
    17571767    if (!checkGCNEncodingSize(asmr, instrPlace, gcnEncSize, wordsNum))
    17581768        return false;
     
    19071917                0, wordsNum, words);
    19081918    else
    1909     {
    19101919        // VOP3 encoding
    1911         uint32_t code = (isGCN12) ?
    1912                 (uint32_t(gcnInsn.code2)<<16) | ((modifiers&VOP3_CLAMP) ? 0x8000 : 0) :
    1913                 (uint32_t(gcnInsn.code2)<<17) | ((modifiers&VOP3_CLAMP) ? 0x800 : 0);
    1914         SLEV(words[0], 0xd0000000U | code | (dstReg.bstart()&0xff) |
    1915             ((src0Op.vopMods & VOPOP_ABS) ? 0x100 : 0) |
    1916             ((opMods.opselMod&15) << 11));
    1917         SLEV(words[1], src0Op.range.bstart() | (uint32_t(modifiers & 3) << 27) |
    1918             ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0));
    1919         wordsNum++;
    1920     }
     1920        encodeVOP3Words(isGCN12, gcnInsn, modifiers, opMods, false,
     1921                dstReg, RegRange{}, RegRange{}, src0Op, GCNOperand{}, wordsNum, words);
     1922   
    19211923    if (!checkGCNEncodingSize(asmr, instrPlace, gcnEncSize, wordsNum))
    19221924        return false;
     
    20962098    }
    20972099    else
    2098     {
    20992100        // VOP3 encoding
    2100         uint32_t code = (isGCN12) ?
    2101                 (uint32_t(gcnInsn.code2)<<16) | ((modifiers&VOP3_CLAMP) ? 0x8000 : 0) :
    2102                 (uint32_t(gcnInsn.code2)<<17) | ((modifiers&VOP3_CLAMP) ? 0x800 : 0);
    2103         SLEV(words[0], 0xd0000000U | code | (dstReg.bstart()&0xff) |
    2104                 ((src0Op.vopMods & VOPOP_ABS) ? 0x100 : 0) |
    2105                 ((src1Op.vopMods & VOPOP_ABS) ? 0x200 : 0) |
    2106                 ((opMods.opselMod&15) << 11));
    2107         SLEV(words[1], src0Op.range.bstart() | (uint32_t(src1Op.range.bstart())<<9) |
    2108             (uint32_t(modifiers & 3) << 27) |
    2109             ((src0Op.vopMods & VOPOP_NEG) ? (1U<<29) : 0) |
    2110             ((src1Op.vopMods & VOPOP_NEG) ? (1U<<30) : 0));
    2111         wordsNum++;
    2112     }
     2101        encodeVOP3Words(isGCN12, gcnInsn, modifiers, opMods, false,
     2102                dstReg, RegRange{}, RegRange{}, src0Op, src1Op, wordsNum, words);
     2103   
    21132104    if (!checkGCNEncodingSize(asmr, instrPlace, gcnEncSize, wordsNum))
    21142105        return false;
Note: See TracChangeset for help on using the changeset viewer.