| | 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> |