Changeset 3070 in CLRX


Ignore:
Timestamp:
May 22, 2017, 5:59:53 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: GCNDisasm: Add VOP3P instructions and encoding modes (for AMD VEGA).

Location:
CLRadeonExtender/trunk
Files:
5 edited

Legend:

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

    r3056 r3070  
    19351935    GCNOperand src2Op{};
    19361936   
    1937     const bool is128Ops = (gcnInsn.mode & 0xf000) == GCN_VOP3_DS2_128;
     1937    const bool is128Ops = (gcnInsn.mode & 0x7000) == GCN_VOP3_DS2_128;
    19381938    bool modHigh = false;
    19391939    cxbyte modifiers = 0;
  • CLRadeonExtender/trunk/amdasm/GCNDisasm.cpp

    r3067 r3070  
    2020#include <CLRX/Config.h>
    2121#include <algorithm>
     22#include <iostream>
    2223#include <cstring>
    2324#include <mutex>
     
    18161817    bool vsrc2CC = false;
    18171818    cxuint absFlags = 0;
    1818    
    1819     if (gcnInsn.encoding == GCNENC_VOP3A)
     1819    cxuint negFlags = 0;
     1820   
     1821    if (gcnInsn.encoding == GCNENC_VOP3A && vop3Mode != GCN_VOP3_VOP3P)
    18201822        absFlags = (insnCode>>8)&7;
    1821    
    1822     const bool is128Ops = (gcnInsn.mode&0xf000)==GCN_VOP3_DS2_128;
     1823    if (vop3Mode != GCN_VOP3_VOP3P)
     1824        negFlags = (insnCode2>>29)&7;
     1825   
     1826    const bool is128Ops = (gcnInsn.mode&0x7000)==GCN_VOP3_DS2_128;
    18231827   
    18241828    if (mode1 != GCN_VOP_ARG_NONE)
     
    18461850        if (vop3Mode != GCN_VOP3_VINTRP)
    18471851        {
    1848             if ((insnCode2 & (1U<<29)) != 0)
     1852            if (negFlags & 1)
    18491853                *bufPtr++ = '-';
    18501854            if (absFlags & 1)
     
    18591863        if (vop3Mode == GCN_VOP3_VINTRP)
    18601864        {
    1861             if ((insnCode2 & (1U<<30)) != 0)
     1865            if (negFlags & 2)
    18621866                *bufPtr++ = '-';
    18631867            if (absFlags & 2)
     
    18791883                *bufPtr++ = ',';
    18801884                *bufPtr++ = ' ';
    1881                 if ((insnCode2 & (1U<<31)) != 0)
     1885                if (negFlags & 4)
    18821886                    *bufPtr++ = '-';
    18831887                if (absFlags & 4)
     
    18981902            *bufPtr++ = ',';
    18991903            *bufPtr++ = ' ';
    1900             if ((insnCode2 & (1U<<30)) != 0)
     1904            if (negFlags & 2)
    19011905                *bufPtr++ = '-';
    19021906            if (absFlags & 2)
     
    19191923                else
    19201924                {
    1921                     if ((insnCode2 & (1U<<31)) != 0)
     1925                    if (negFlags & 4)
    19221926                        *bufPtr++ = '-';
    19231927                    if (absFlags & 4)
     
    19401944        addSpaces(bufPtr, spacesToAdd-1);
    19411945   
    1942     if (isGCN14 && (gcnInsn.mode & GCN_VOP3_OPSEL) != 0 && (insnCode & 0x7800) != 0)
     1946    if (isGCN14 && (gcnInsn.mode & GCN_VOP3_OPSEL) != 0)
    19431947    {   // insnCode
    1944         putChars(bufPtr, " op_sel:[", 9);
    1945         *bufPtr++ = (insnCode&0x800) ? '1' : '0';
    1946         *bufPtr++ = ',';
    1947         *bufPtr++ = (insnCode&0x1000) ? '1' : '0';
    1948         if (vsrc1Used)
    1949         {
     1948        const bool opsel2Bit = (vop3Mode!=GCN_VOP3_VOP3P && vsrc1Used) ||
     1949            (vop3Mode==GCN_VOP3_VOP3P && vsrc2Used);
     1950        const bool opsel3Bit = (vsrc2Used && vop3Mode!=GCN_VOP3_VOP3P);
     1951        if ((insnCode & ((3 + (opsel2Bit?4:0) + (opsel3Bit?8:0))<<11)) != 0)
     1952        {
     1953            putChars(bufPtr, " op_sel:[", 9);
     1954            *bufPtr++ = (insnCode&0x800) ? '1' : '0';
    19501955            *bufPtr++ = ',';
    1951             *bufPtr++ = (insnCode&0x2000) ? '1' : '0';
    1952         }
    1953         if (vsrc2Used)
    1954         {
     1956            *bufPtr++ = (insnCode&0x1000) ? '1' : '0';
     1957            if ((vop3Mode!=GCN_VOP3_VOP3P && vsrc1Used) ||
     1958                (vop3Mode==GCN_VOP3_VOP3P && vsrc2Used))
     1959            {
     1960                *bufPtr++ = ',';
     1961                *bufPtr++ = (insnCode&0x2000) ? '1' : '0';
     1962            }
     1963            if (vsrc2Used && vop3Mode!=GCN_VOP3_VOP3P)
     1964            {
     1965                *bufPtr++ = ',';
     1966                *bufPtr++ = (insnCode&0x4000) ? '1' : '0';
     1967            }
     1968            *bufPtr++ = ']';
     1969        }
     1970    }
     1971   
     1972    if (vop3Mode==GCN_VOP3_VOP3P)
     1973    {
     1974        cxuint opselHi = ((insnCode2 >> 27) & 3) | (vsrc2Used ? ((insnCode>>12)&4) : 0);
     1975        if (opselHi != 3+(vsrc2Used?4:0))
     1976        {
     1977            putChars(bufPtr, " op_sel_hi:[", 12);
     1978            *bufPtr++ = (insnCode2 & (1U<<27)) ? '1' : '0';
    19551979            *bufPtr++ = ',';
    1956             *bufPtr++ = (insnCode&0x4000) ? '1' : '0';
    1957         }
    1958         *bufPtr++ = ']';
     1980            *bufPtr++ = (insnCode2 & (1U<<28)) ? '1' : '0';
     1981            if (vsrc2Used)
     1982            {
     1983                *bufPtr++ = ',';
     1984                *bufPtr++ = (insnCode& 0x4000) ? '1' : '0';
     1985            }
     1986            *bufPtr++ = ']';
     1987        }
     1988        if ((insnCode2&((3+(vsrc2Used?4:0))<<29)) != 0)
     1989        {
     1990            putChars(bufPtr, " neg_lo:[", 9);
     1991            *bufPtr++ = (insnCode2 & (1U<<29)) ? '1' : '0';
     1992            *bufPtr++ = ',';
     1993            *bufPtr++ = (insnCode2 & (1U<<30)) ? '1' : '0';
     1994            if (vsrc2Used)
     1995            {
     1996                *bufPtr++ = ',';
     1997                *bufPtr++ = (insnCode2 & (1U<<31)) ? '1' : '0';
     1998            }
     1999            *bufPtr++ = ']';
     2000        }
     2001        if ((insnCode & ((3+(vsrc2Used?4:0))<<8)) != 0)
     2002        {
     2003            putChars(bufPtr, " neg_hi:[", 9);
     2004            *bufPtr++ = (insnCode & (1U<<8)) ? '1' : '0';
     2005            *bufPtr++ = ',';
     2006            *bufPtr++ = (insnCode & (1U<<9)) ? '1' : '0';
     2007            if (vsrc2Used)
     2008            {
     2009                *bufPtr++ = ',';
     2010                *bufPtr++ = (insnCode & (1U<<10)) ? '1' : '0';
     2011            }
     2012            *bufPtr++ = ']';
     2013        }
    19592014    }
    19602015   
    19612016    const cxuint omod = (insnCode2>>27)&3;
    1962     if (omod != 0)
     2017    if (vop3Mode != GCN_VOP3_VOP3P && omod != 0)
    19632018    {
    19642019        const char* omodStr = (omod==3)?" div:2":(omod==2)?" mul:4":" mul:2";
  • CLRadeonExtender/trunk/amdasm/GCNInstructions.cpp

    r3067 r3070  
    19881988    { "v_div_scale_f32",     GCNENC_VOP3B,  GCN_STDMODE|GCN_S0EQS12,  480,  ARCH_GCN_1_2_4  },
    19891989    { "v_div_scale_f64",     GCNENC_VOP3B,  GCN_REG_ALL_64|GCN_S0EQS12,481,  ARCH_GCN_1_2_4  },
     1990    { "v_pk_mad_i16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL,           896, ARCH_RXVEGA   },
     1991    { "v_pk_mul_lo_u16",     GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 897, ARCH_RXVEGA   },
     1992    { "v_pk_add_i16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 898, ARCH_RXVEGA   },
     1993    { "v_pk_sub_i16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 899, ARCH_RXVEGA   },
     1994    { "v_pk_lshlrev_b16",    GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 900, ARCH_RXVEGA   },
     1995    { "v_pk_lshrrev_b16",    GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 901, ARCH_RXVEGA   },
     1996    { "v_pk_ashrrev_i16",    GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 902, ARCH_RXVEGA   },
     1997    { "v_pk_max_i16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 903, ARCH_RXVEGA   },
     1998    { "v_pk_min_i16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 904, ARCH_RXVEGA   },
     1999    { "v_pk_mad_u16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL,           905, ARCH_RXVEGA   },
     2000    { "v_pk_add_u16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 906, ARCH_RXVEGA   },
     2001    { "v_pk_sub_u16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 907, ARCH_RXVEGA   },
     2002    { "v_pk_max_u16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 908, ARCH_RXVEGA   },
     2003    { "v_pk_min_u16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 909, ARCH_RXVEGA   },
     2004    { "v_pk_fma_f16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL,           910, ARCH_RXVEGA   },
     2005    { "v_pk_add_f16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 911, ARCH_RXVEGA   },
     2006    { "v_pk_mul_f16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 912, ARCH_RXVEGA   },
     2007    { "v_pk_min_f16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 913, ARCH_RXVEGA   },
     2008    { "v_pk_max_f16",        GCNENC_VOP3A,  GCN_VOP3P_OPSEL|GCN_SRC2_NONE, 914, ARCH_RXVEGA   },
     2009    { "v_mad_mix_f32",       GCNENC_VOP3A,  GCN_VOP3P_OPSEL,            928, ARCH_RXVEGA   },
     2010    { "v_mad_mixlo_f16",     GCNENC_VOP3A,  GCN_VOP3P_OPSEL,            929, ARCH_RXVEGA   },
     2011    { "v_mad_mixhi_f16",     GCNENC_VOP3A,  GCN_VOP3P_OPSEL,            930, ARCH_RXVEGA   },
    19902012    { "v_interp_p1_f32",     GCNENC_VINTRP, GCN_STDMODE,              0,    ARCH_GCN_ALL  },
    19912013    { "v_interp_p2_f32",     GCNENC_VINTRP, GCN_STDMODE,              1,    ARCH_GCN_ALL  },
  • CLRadeonExtender/trunk/amdasm/GCNInternals.h

    r3067 r3070  
    115115    GCN_VOP3_VOP1 = 0x200,  /// VOP1 encoded as VOP3
    116116    GCN_VOP3_VINTRP = 0x300,    /// VINTRP encoded as VOP3
    117     GCN_VOP3_DS2_128 = 0xf000,   /// VOP3 with DST 128 and SRC2 128
     117    GCN_VOP3_DS2_128 = 0x7000,   /// VOP3 with DST 128 and SRC2 128
    118118    GCN_VOP3_VINTRP_NEW = 0x3e0,    /// new VINTRP instructions encoded as VOP3
    119119    GCN_VOP3_VOP2_DS01 = 0x110, /// VOP2 in VOP3, destination and two sources
     
    122122    GCN_VOP3_SRC1_SGPR = 0x800,   /// VOPX in VOP3, and src1 is SGPR (if mask1 used)
    123123    GCN_VOP3_DS1_SGPR = 0xc00, /// VOPX in VOP3, and dst and src1 is SGPR (if mask1 used)
    124     GCN_VOP3_MASK2 = 0x300,     // mask for VOPx in VOP2 encodings
     124    GCN_VOP3_MASK2 = 0x8300,    // mask for VOPx in VOP2 encodings
    125125    GCN_VINTRP_SRC2 = 0x1000,   /// VOP3/VINTRP with source2 (third source)
    126126    GCN_VOP3_MASK3 = 0x3000,    /// mask for VINTRP in VOP2 encodings
    127127    GCN_VOP3_OPSEL = 0x4000,    /// if instruction uses op_sel modifier
     128    GCN_VOP3_VOP3P = 0x8000,    /// VOP3P encoding
     129    GCN_VOP3P_OPSEL = 0xc000,    /// VOP3P encoding with opsel
    128130    // DS encoding modes
    129131    GCN_ADDR_STD = 0x0,    /// standard place of address
  • CLRadeonExtender/trunk/tests/amdasm/GCNDisasmOpc14.cpp

    r3067 r3070  
    359359    { 0xd1db5837U, 0x07974d4fU, true,
    360360        "        v_sad_u16       v55, v79, v166, v229 op_sel=0xb\n" },
     361    // VOP3P encoding
     362    { 0xd3800037U, 0x07974d4fU, true,
     363        "        v_pk_mad_i16    v55, v79, v166, v229 op_sel_hi:[0,0,0]\n" },
     364    { 0xd3804037U, 0x1f974d4fU, true,
     365        "        v_pk_mad_i16    v55, v79, v166, v229\n" },
     366    { 0xd3800037U, 0x0f974d4fU, true,
     367        "        v_pk_mad_i16    v55, v79, v166, v229 op_sel_hi:[1,0,0]\n" },
     368    { 0xd3800037U, 0x17974d4fU, true,
     369        "        v_pk_mad_i16    v55, v79, v166, v229 op_sel_hi:[0,1,0]\n" },
     370    { 0xd3824037U, 0x10034d4fU, true,
     371        "        v_pk_add_i16    v55, v79, v166 op_sel_hi:[0,1]\n" },
     372    { 0xd3804037U, 0x07974d4fU, true,
     373        "        v_pk_mad_i16    v55, v79, v166, v229 op_sel_hi:[0,0,1]\n" },
     374    { 0xd3800837U, 0x07974d4fU, true, "        v_pk_mad_i16    "
     375            "v55, v79, v166, v229 op_sel:[1,0,0] op_sel_hi:[0,0,0]\n" },
     376    { 0xd3801037U, 0x07974d4fU, true, "        v_pk_mad_i16    "
     377            "v55, v79, v166, v229 op_sel:[0,1,0] op_sel_hi:[0,0,0]\n" },
     378    { 0xd3802037U, 0x07974d4fU, true, "        v_pk_mad_i16    "
     379            "v55, v79, v166, v229 op_sel:[0,0,1] op_sel_hi:[0,0,0]\n" },
     380    { 0xd3825837U, 0x10034d4fU, true,
     381        "        v_pk_add_i16    v55, v79, v166 op_sel:[1,1] op_sel_hi:[0,1]\n" },
     382    { 0xd3804137U, 0x1f974d4fU, true,
     383        "        v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[1,0,0]\n" },
     384    { 0xd3804237U, 0x1f974d4fU, true,
     385        "        v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[0,1,0]\n" },
     386    { 0xd3804337U, 0x1f974d4fU, true,
     387        "        v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[1,1,0]\n" },
     388    { 0xd3804437U, 0x1f974d4fU, true,
     389        "        v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[0,0,1]\n" },
     390    { 0xd3804537U, 0x1f974d4fU, true,
     391        "        v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[1,0,1]\n" },
     392    { 0xd3804637U, 0x1f974d4fU, true,
     393        "        v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[0,1,1]\n" },
     394    { 0xd3804737U, 0x1f974d4fU, true,
     395        "        v_pk_mad_i16    v55, v79, v166, v229 neg_hi:[1,1,1]\n" },
     396    { 0xd3824337U, 0x18034d4fU, true,
     397        "        v_pk_add_i16    v55, v79, v166 neg_hi:[1,1]\n" },
     398    { 0xd3804037U, 0x3f974d4fU, true,
     399        "        v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[1,0,0]\n" },
     400    { 0xd3804037U, 0x5f974d4fU, true,
     401        "        v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[0,1,0]\n" },
     402    { 0xd3804037U, 0x7f974d4fU, true,
     403        "        v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[1,1,0]\n" },
     404    { 0xd3804037U, 0x9f974d4fU, true,
     405        "        v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[0,0,1]\n" },
     406    { 0xd3804037U, 0xbf974d4fU, true,
     407        "        v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[1,0,1]\n" },
     408    { 0xd3804037U, 0xdf974d4fU, true,
     409        "        v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[0,1,1]\n" },
     410    { 0xd3804037U, 0xff974d4fU, true,
     411        "        v_pk_mad_i16    v55, v79, v166, v229 neg_lo:[1,1,1]\n" },
     412    { 0xd3824037U, 0x78034d4fU, true,
     413        "        v_pk_add_i16    v55, v79, v166 neg_lo:[1,1]\n" },
     414    /* VOP3P instructions */
     415    { 0xd3814037U, 0x18034d4fU, true, "        v_pk_mul_lo_u16 v55, v79, v166\n" },
     416    { 0xd3824037U, 0x18034d4fU, true, "        v_pk_add_i16    v55, v79, v166\n" },
     417    { 0xd3834037U, 0x18034d4fU, true, "        v_pk_sub_i16    v55, v79, v166\n" },
     418    { 0xd3844037U, 0x18034d4fU, true, "        v_pk_lshlrev_b16 v55, v79, v166\n" },
     419    { 0xd3854037U, 0x18034d4fU, true, "        v_pk_lshrrev_b16 v55, v79, v166\n" },
     420    { 0xd3864037U, 0x18034d4fU, true, "        v_pk_ashrrev_i16 v55, v79, v166\n" },
     421    { 0xd3874037U, 0x18034d4fU, true, "        v_pk_max_i16    v55, v79, v166\n" },
     422    { 0xd3884037U, 0x18034d4fU, true, "        v_pk_min_i16    v55, v79, v166\n" },
     423    { 0xd3894037U, 0x1f974d4fU, true, "        v_pk_mad_u16    v55, v79, v166, v229\n" },
     424    { 0xd38a4037U, 0x18034d4fU, true, "        v_pk_add_u16    v55, v79, v166\n" },
     425    { 0xd38b4037U, 0x18034d4fU, true, "        v_pk_sub_u16    v55, v79, v166\n" },
     426    { 0xd38c4037U, 0x18034d4fU, true, "        v_pk_max_u16    v55, v79, v166\n" },
     427    { 0xd38d4037U, 0x18034d4fU, true, "        v_pk_min_u16    v55, v79, v166\n" },
     428    { 0xd38e4037U, 0x1f974d4fU, true, "        v_pk_fma_f16    v55, v79, v166, v229\n" },
     429    { 0xd38f4037U, 0x18034d4fU, true, "        v_pk_add_f16    v55, v79, v166\n" },
     430    { 0xd3904037U, 0x18034d4fU, true, "        v_pk_mul_f16    v55, v79, v166\n" },
     431    { 0xd3914037U, 0x18034d4fU, true, "        v_pk_min_f16    v55, v79, v166\n" },
     432    { 0xd3924037U, 0x18034d4fU, true, "        v_pk_max_f16    v55, v79, v166\n" },
     433    { 0xd3a04037U, 0x1f974d4fU, true, "        v_mad_mix_f32   v55, v79, v166, v229\n" },
     434    { 0xd3a14037U, 0x1f974d4fU, true, "        v_mad_mixlo_f16 v55, v79, v166, v229\n" },
     435    { 0xd3a24037U, 0x1f974d4fU, true, "        v_mad_mixhi_f16 v55, v79, v166, v229\n" },
    361436    { 0, 0, false, nullptr }
    362437};
Note: See TracChangeset for help on using the changeset viewer.