Changes between Version 2 and Version 3 of GcnSdwaDpp


Ignore:
Timestamp:
06/04/17 19:00:31 (7 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • GcnSdwaDpp

    v2 v3  
    8282</table>
    8383<p>The DST_SEL modifier determines which part of dword will hold first part (with same length)
    84 of destination dword will be placed. This make operation <code>(RESULT &amp; PARTMASK) &lt;&lt; PARTSHIFT</code>.
     84of destination dword. This make operation <code>(RESULT &amp; PARTMASK) &lt;&lt; PARTSHIFT</code>.
    8585The SRC0_SEL and SRC1_SEL determines which part of source dword will be placed to first
    8686part of this source dword. This make operation <code>(SOURCE&gt;&gt;PARTSHIFT) &amp; PARTMASK</code>.
     
    175175(fill bits after part) to source operand while for source operand was not
    176176selected whole dword (SDWA_DWORD not choosen).</p>
     177<p>Operation code:<br />
     178<code>// SRC0_SRC = source SRC0, SRC1_SRC = source SRC1, DST_SRC = VDST source
     179// SRC0_DST = dest. SRC0, SRC1_DST = dest. SRC1, DST_DST = VDST dest.
     180// OPERATION(SRC0, SRC1) - instruction operation, VDST - VDST register before instruction
     181if (HAVE_SRC0)
     182{
     183    switch(SRC0_SEL)
     184    {
     185        case SDWA_BYTE_0:
     186            SRC0_DST = (SRC0_SEXT) ? INT32(INT8(SRC0_SRC &amp; 0xff)) : SRC0_SRC &amp; 0xff
     187            break;
     188        case SDWA_BYTE_1:
     189            SRC0_DST = (SRC0_SEXT) ? INT32(INT8((SRC0_SRC&gt;&gt;8) &amp; 0xff)) :
     190                        (SRC0_SRC&gt;&gt;8) &amp; 0xff
     191            break;
     192        case SDWA_BYTE_2:
     193            SRC0_DST = (SRC0_SEXT) ? INT32(INT8((SRC0_SRC&gt;&gt;16) &amp; 0xff)) :
     194                        (SRC0_SRC&gt;&gt;16) &amp; 0xff
     195            break;
     196        case SDWA_BYTE_1:
     197            SRC0_DST = (SRC0_SEXT) ? INT32(INT8(SRC0_SRC&gt;&gt;24)) : SRC0_SRC&gt;&gt;24
     198            break;
     199        case SDWA_WORD_0:
     200            SRC0_DST = (SRC0_SEXT) ? INT32(INT16(SRC0_SRC &amp; 0xffff)) : SRC0_SRC &amp; 0xffff
     201            break;
     202        case SDWA_WORD_1:
     203            SRC0_DST = (SRC0_SEXT) ? INT32(INT16(SRC0_SRC &gt;&gt; 16)) : SRC0_SRC &gt;&gt; 16
     204            break;
     205        case SDWA_DWORD:
     206            SRC0_DST = SRC0_SRC
     207            break;
     208    }
     209}
     210if (HAVE_SRC1)
     211{
     212    switch(SRC1_SEL)
     213    {
     214        case SDWA_BYTE_0:
     215            SRC1_DST = (SRC1_SEXT) ? INT32(INT8(SRC1_SRC &amp; 0xff)) : SRC1_SRC &amp; 0xff
     216            break;
     217        case SDWA_BYTE_1:
     218            SRC1_DST = (SRC1_SEXT) ? INT32(INT8((SRC1_SRC&gt;&gt;8) &amp; 0xff)) :
     219                        (SRC1_SRC&gt;&gt;8) &amp; 0xff
     220            break;
     221        case SDWA_BYTE_2:
     222            SRC1_DST = (SRC1_SEXT) ? INT32(INT8((SRC1_SRC&gt;&gt;16) &amp; 0xff)) :
     223                        (SRC1_SRC&gt;&gt;16) &amp; 0xff
     224            break;
     225        case SDWA_BYTE_1:
     226            SRC1_DST = (SRC1_SEXT) ? INT32(INT8(SRC1_SRC&gt;&gt;24)) : SRC1_SRC&gt;&gt;24
     227            break;
     228        case SDWA_WORD_0:
     229            SRC1_DST = (SRC1_SEXT) ? INT32(INT16(SRC1_SRC &amp; 0xffff)) : SRC1_SRC &amp; 0xffff
     230            break;
     231        case SDWA_WORD_1:
     232            SRC1_DST = (SRC1_SEXT) ? INT32(INT16(SRC1_SRC &gt;&gt; 16)) : SRC1_SRC &gt;&gt; 16
     233            break;
     234        case SDWA_DWORD:
     235            SRC1_DST = SRC1_SRC
     236            break;
     237    }
     238}
     239DST_SRC = OPERATION(SRC0,SRC1)
     240UNT32 tmp
     241switch(DST_SEL)
     242{
     243    case SDWA_BYTE_0:
     244        tmp = DST_SRC &amp; 0xff
     245        if (DST_UNUSED==SDWA_UNUSED_PAD)
     246            DST_DST = tmp
     247        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     248            DST_DST = INT32(INT8(tmp))
     249        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     250            DST_DST = tmp | (VDST &amp; 0xffffff00)
     251        break;
     252    case SDWA_BYTE_1:
     253        tmp = DST_SRC &amp; 0xff
     254        if (DST_UNUSED==SDWA_UNUSED_PAD)
     255            DST_DST = tmp &lt;&lt; 8
     256        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     257            DST_DST = INT32(INT8(tmp)) &lt;&lt; 8
     258        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     259            DST_DST = (tmp&lt;&lt;8) | (VDST &amp; 0xffff00ff)
     260        break;
     261    case SDWA_BYTE_2:
     262        tmp = DST_SRC &amp; 0xff
     263        if (DST_UNUSED==SDWA_UNUSED_PAD)
     264            DST_DST = tmp &lt;&lt; 16
     265        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     266            DST_DST = INT32(INT8(tmp)) &lt;&lt; 16
     267        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     268            DST_DST = (tmp&lt;&lt;16) | (VDST &amp; 0xff00ffff)
     269        break;
     270    case SDWA_BYTE_3:
     271        tmp = DST_SRC &amp; 0xff
     272        if (DST_UNUSED==SDWA_UNUSED_PAD)
     273            DST_DST = tmp &lt;&lt; 24
     274        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     275            DST_DST = INT32(INT8(tmp)) &lt;&lt; 24
     276        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     277            DST_DST = (tmp&lt;&lt;24) | (VDST &amp; 0x00ffffff)
     278        break;
     279    case SDWA_WORD_0:
     280        tmp = DST_SRC &amp; 0xffff
     281        if (DST_UNUSED==SDWA_UNUSED_PAD)
     282            DST_DST = tmp
     283        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     284            DST_DST = INT32(INT16(tmp))
     285        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     286            DST_DST = tmp | (VDST &amp; 0xffff0000)
     287        break;
     288    case SDWA_WORD_1:
     289        tmp = DST_SRC &amp; 0xffff
     290        if (DST_UNUSED==SDWA_UNUSED_PAD)
     291            DST_DST = tmp &lt;&lt; 16
     292        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     293            DST_DST = INT32(INT16(tmp)) &lt;&lt; 16
     294        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     295            DST_DST = (tmp&lt;&lt;16) | (VDST &amp; 0xffff)
     296        break;
     297    case SDWA_DWORD:
     298        DST_DST = DST_SRC
     299        break;
     300}</code></p>
    177301}}}