Changeset 3135 in CLRX


Ignore:
Timestamp:
Jun 4, 2017, 6:06:27 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: CLRXDocs: Add operation to SDWA encoding.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/doc/GcnSdwaDpp.md

    r3134 r3135  
    5454(fill bits after part) to source operand while for source operand was not
    5555selected whole dword (SDWA_DWORD not choosen).
     56
     57Operation code: 
     58```
     59// SRC0_SRC = source SRC0, SRC1_SRC = source SRC1, DST_SRC = VDST source
     60// SRC0_DST = dest. SRC0, SRC1_DST = dest. SRC1, DST_DST = VDST dest.
     61// OPERATION(SRC0, SRC1) - instruction operation, VDST - VDST register before instruction
     62if (HAVE_SRC0)
     63{
     64    switch(SRC0_SEL)
     65    {
     66        case SDWA_BYTE_0:
     67            SRC0_DST = (SRC0_SEXT) ? INT32(INT8(SRC0_SRC & 0xff)) : SRC0_SRC & 0xff
     68            break;
     69        case SDWA_BYTE_1:
     70            SRC0_DST = (SRC0_SEXT) ? INT32(INT8((SRC0_SRC>>8) & 0xff)) :
     71                        (SRC0_SRC>>8) & 0xff
     72            break;
     73        case SDWA_BYTE_2:
     74            SRC0_DST = (SRC0_SEXT) ? INT32(INT8((SRC0_SRC>>16) & 0xff)) :
     75                        (SRC0_SRC>>16) & 0xff
     76            break;
     77        case SDWA_BYTE_1:
     78            SRC0_DST = (SRC0_SEXT) ? INT32(INT8(SRC0_SRC>>24)) : SRC0_SRC>>24
     79            break;
     80        case SDWA_WORD_0:
     81            SRC0_DST = (SRC0_SEXT) ? INT32(INT16(SRC0_SRC & 0xffff)) : SRC0_SRC & 0xffff
     82            break;
     83        case SDWA_WORD_1:
     84            SRC0_DST = (SRC0_SEXT) ? INT32(INT16(SRC0_SRC >> 16)) : SRC0_SRC >> 16
     85            break;
     86        case SDWA_DWORD:
     87            SRC0_DST = SRC0_SRC
     88            break;
     89    }
     90}
     91if (HAVE_SRC1)
     92{
     93    switch(SRC1_SEL)
     94    {
     95        case SDWA_BYTE_0:
     96            SRC1_DST = (SRC1_SEXT) ? INT32(INT8(SRC1_SRC & 0xff)) : SRC1_SRC & 0xff
     97            break;
     98        case SDWA_BYTE_1:
     99            SRC1_DST = (SRC1_SEXT) ? INT32(INT8((SRC1_SRC>>8) & 0xff)) :
     100                        (SRC1_SRC>>8) & 0xff
     101            break;
     102        case SDWA_BYTE_2:
     103            SRC1_DST = (SRC1_SEXT) ? INT32(INT8((SRC1_SRC>>16) & 0xff)) :
     104                        (SRC1_SRC>>16) & 0xff
     105            break;
     106        case SDWA_BYTE_1:
     107            SRC1_DST = (SRC1_SEXT) ? INT32(INT8(SRC1_SRC>>24)) : SRC1_SRC>>24
     108            break;
     109        case SDWA_WORD_0:
     110            SRC1_DST = (SRC1_SEXT) ? INT32(INT16(SRC1_SRC & 0xffff)) : SRC1_SRC & 0xffff
     111            break;
     112        case SDWA_WORD_1:
     113            SRC1_DST = (SRC1_SEXT) ? INT32(INT16(SRC1_SRC >> 16)) : SRC1_SRC >> 16
     114            break;
     115        case SDWA_DWORD:
     116            SRC1_DST = SRC1_SRC
     117            break;
     118    }
     119}
     120DST_SRC = OPERATION(SRC0,SRC1)
     121UNT32 tmp
     122switch(DST_SEL)
     123{
     124    case SDWA_BYTE_0:
     125        tmp = DST_SRC & 0xff
     126        if (DST_UNUSED==SDWA_UNUSED_PAD)
     127            DST_DST = tmp
     128        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     129            DST_DST = INT32(INT8(tmp))
     130        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     131            DST_DST = tmp | (VDST & 0xffffff00)
     132        break;
     133    case SDWA_BYTE_1:
     134        tmp = DST_SRC & 0xff
     135        if (DST_UNUSED==SDWA_UNUSED_PAD)
     136            DST_DST = tmp << 8
     137        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     138            DST_DST = INT32(INT8(tmp)) << 8
     139        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     140            DST_DST = (tmp<<8) | (VDST & 0xffff00ff)
     141        break;
     142    case SDWA_BYTE_2:
     143        tmp = DST_SRC & 0xff
     144        if (DST_UNUSED==SDWA_UNUSED_PAD)
     145            DST_DST = tmp << 16
     146        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     147            DST_DST = INT32(INT8(tmp)) << 16
     148        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     149            DST_DST = (tmp<<16) | (VDST & 0xff00ffff)
     150        break;
     151    case SDWA_BYTE_3:
     152        tmp = DST_SRC & 0xff
     153        if (DST_UNUSED==SDWA_UNUSED_PAD)
     154            DST_DST = tmp << 24
     155        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     156            DST_DST = INT32(INT8(tmp)) << 24
     157        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     158            DST_DST = (tmp<<24) | (VDST & 0x00ffffff)
     159        break;
     160    case SDWA_WORD_0:
     161        tmp = DST_SRC & 0xffff
     162        if (DST_UNUSED==SDWA_UNUSED_PAD)
     163            DST_DST = tmp
     164        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     165            DST_DST = INT32(INT16(tmp))
     166        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     167            DST_DST = tmp | (VDST & 0xffff0000)
     168        break;
     169    case SDWA_WORD_1:
     170        tmp = DST_SRC & 0xffff
     171        if (DST_UNUSED==SDWA_UNUSED_PAD)
     172            DST_DST = tmp << 16
     173        else if (DST_UNUSED==SDWA_UNUSED_SEXT)
     174            DST_DST = INT32(INT16(tmp)) << 16
     175        else if (DST_UNUSED==SDWA_UNUSED_PRESERVE)
     176            DST_DST = (tmp<<16) | (VDST & 0xffff)
     177        break;
     178    case SDWA_DWORD:
     179        DST_DST = DST_SRC
     180        break;
     181}
     182```
Note: See TracChangeset for help on using the changeset viewer.