| 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 |
| 181 | if (HAVE_SRC0) |
| 182 | { |
| 183 | switch(SRC0_SEL) |
| 184 | { |
| 185 | case SDWA_BYTE_0: |
| 186 | SRC0_DST = (SRC0_SEXT) ? INT32(INT8(SRC0_SRC & 0xff)) : SRC0_SRC & 0xff |
| 187 | break; |
| 188 | case SDWA_BYTE_1: |
| 189 | SRC0_DST = (SRC0_SEXT) ? INT32(INT8((SRC0_SRC>>8) & 0xff)) : |
| 190 | (SRC0_SRC>>8) & 0xff |
| 191 | break; |
| 192 | case SDWA_BYTE_2: |
| 193 | SRC0_DST = (SRC0_SEXT) ? INT32(INT8((SRC0_SRC>>16) & 0xff)) : |
| 194 | (SRC0_SRC>>16) & 0xff |
| 195 | break; |
| 196 | case SDWA_BYTE_1: |
| 197 | SRC0_DST = (SRC0_SEXT) ? INT32(INT8(SRC0_SRC>>24)) : SRC0_SRC>>24 |
| 198 | break; |
| 199 | case SDWA_WORD_0: |
| 200 | SRC0_DST = (SRC0_SEXT) ? INT32(INT16(SRC0_SRC & 0xffff)) : SRC0_SRC & 0xffff |
| 201 | break; |
| 202 | case SDWA_WORD_1: |
| 203 | SRC0_DST = (SRC0_SEXT) ? INT32(INT16(SRC0_SRC >> 16)) : SRC0_SRC >> 16 |
| 204 | break; |
| 205 | case SDWA_DWORD: |
| 206 | SRC0_DST = SRC0_SRC |
| 207 | break; |
| 208 | } |
| 209 | } |
| 210 | if (HAVE_SRC1) |
| 211 | { |
| 212 | switch(SRC1_SEL) |
| 213 | { |
| 214 | case SDWA_BYTE_0: |
| 215 | SRC1_DST = (SRC1_SEXT) ? INT32(INT8(SRC1_SRC & 0xff)) : SRC1_SRC & 0xff |
| 216 | break; |
| 217 | case SDWA_BYTE_1: |
| 218 | SRC1_DST = (SRC1_SEXT) ? INT32(INT8((SRC1_SRC>>8) & 0xff)) : |
| 219 | (SRC1_SRC>>8) & 0xff |
| 220 | break; |
| 221 | case SDWA_BYTE_2: |
| 222 | SRC1_DST = (SRC1_SEXT) ? INT32(INT8((SRC1_SRC>>16) & 0xff)) : |
| 223 | (SRC1_SRC>>16) & 0xff |
| 224 | break; |
| 225 | case SDWA_BYTE_1: |
| 226 | SRC1_DST = (SRC1_SEXT) ? INT32(INT8(SRC1_SRC>>24)) : SRC1_SRC>>24 |
| 227 | break; |
| 228 | case SDWA_WORD_0: |
| 229 | SRC1_DST = (SRC1_SEXT) ? INT32(INT16(SRC1_SRC & 0xffff)) : SRC1_SRC & 0xffff |
| 230 | break; |
| 231 | case SDWA_WORD_1: |
| 232 | SRC1_DST = (SRC1_SEXT) ? INT32(INT16(SRC1_SRC >> 16)) : SRC1_SRC >> 16 |
| 233 | break; |
| 234 | case SDWA_DWORD: |
| 235 | SRC1_DST = SRC1_SRC |
| 236 | break; |
| 237 | } |
| 238 | } |
| 239 | DST_SRC = OPERATION(SRC0,SRC1) |
| 240 | UNT32 tmp |
| 241 | switch(DST_SEL) |
| 242 | { |
| 243 | case SDWA_BYTE_0: |
| 244 | tmp = DST_SRC & 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 & 0xffffff00) |
| 251 | break; |
| 252 | case SDWA_BYTE_1: |
| 253 | tmp = DST_SRC & 0xff |
| 254 | if (DST_UNUSED==SDWA_UNUSED_PAD) |
| 255 | DST_DST = tmp << 8 |
| 256 | else if (DST_UNUSED==SDWA_UNUSED_SEXT) |
| 257 | DST_DST = INT32(INT8(tmp)) << 8 |
| 258 | else if (DST_UNUSED==SDWA_UNUSED_PRESERVE) |
| 259 | DST_DST = (tmp<<8) | (VDST & 0xffff00ff) |
| 260 | break; |
| 261 | case SDWA_BYTE_2: |
| 262 | tmp = DST_SRC & 0xff |
| 263 | if (DST_UNUSED==SDWA_UNUSED_PAD) |
| 264 | DST_DST = tmp << 16 |
| 265 | else if (DST_UNUSED==SDWA_UNUSED_SEXT) |
| 266 | DST_DST = INT32(INT8(tmp)) << 16 |
| 267 | else if (DST_UNUSED==SDWA_UNUSED_PRESERVE) |
| 268 | DST_DST = (tmp<<16) | (VDST & 0xff00ffff) |
| 269 | break; |
| 270 | case SDWA_BYTE_3: |
| 271 | tmp = DST_SRC & 0xff |
| 272 | if (DST_UNUSED==SDWA_UNUSED_PAD) |
| 273 | DST_DST = tmp << 24 |
| 274 | else if (DST_UNUSED==SDWA_UNUSED_SEXT) |
| 275 | DST_DST = INT32(INT8(tmp)) << 24 |
| 276 | else if (DST_UNUSED==SDWA_UNUSED_PRESERVE) |
| 277 | DST_DST = (tmp<<24) | (VDST & 0x00ffffff) |
| 278 | break; |
| 279 | case SDWA_WORD_0: |
| 280 | tmp = DST_SRC & 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 & 0xffff0000) |
| 287 | break; |
| 288 | case SDWA_WORD_1: |
| 289 | tmp = DST_SRC & 0xffff |
| 290 | if (DST_UNUSED==SDWA_UNUSED_PAD) |
| 291 | DST_DST = tmp << 16 |
| 292 | else if (DST_UNUSED==SDWA_UNUSED_SEXT) |
| 293 | DST_DST = INT32(INT16(tmp)) << 16 |
| 294 | else if (DST_UNUSED==SDWA_UNUSED_PRESERVE) |
| 295 | DST_DST = (tmp<<16) | (VDST & 0xffff) |
| 296 | break; |
| 297 | case SDWA_DWORD: |
| 298 | DST_DST = DST_SRC |
| 299 | break; |
| 300 | }</code></p> |