165 |
|
|
166 |
|
#define mdsform(s) fprintf(f, "%s%s\tr%d,r%d,r%d,%d\n", s, w & 1 ? "." : "", ra, rd, rb, rc | (w & 32 ? 32 : 0)) |
167 |
|
|
168 |
– |
#define vx_form(s) fprintf(f, "%s\tv%d,v%d,v%d\n", s, rd, ra, rb) |
169 |
– |
#define vxi_form(s) fprintf(f, "%s\tv%d,v%d,v%d,%d\n", s, rd, ra, rb, (rc & 15)) |
168 |
|
#define va_form(s) fprintf(f, "%s\tv%d,v%d,v%d,v%d\n", s, rd, ra, rb, rc) |
169 |
+ |
#define vx_form(s) fprintf(f, "%s\tv%d,v%d,v%d\n", s, rd, ra, rb) |
170 |
+ |
#define vxr_form(s) fprintf(f, "%s%s\tv%d,v%d,v%d\n", s, w & (1 << 10) ? "." : "", rd, ra, rb) |
171 |
+ |
#define vxi_ra_form(s) fprintf(f, "%s\tv%d,v%d,%d\n", s, rd, rb, ra) |
172 |
+ |
#define vx_raz_form(s) \ |
173 |
+ |
if (ra == 0) \ |
174 |
+ |
fprintf(f, "%s\tv%d,v%d\n", s, rd, rb); \ |
175 |
+ |
else \ |
176 |
+ |
fprintf(f, "?\n") |
177 |
+ |
#define vxi_ras_rbz_form(s) \ |
178 |
+ |
if (rb == 0) \ |
179 |
+ |
fprintf(f, "%s\tv%d,%d\n", s, rd, ra - (ra & 0x10 ? 0x20 : 0)); \ |
180 |
+ |
else \ |
181 |
+ |
fprintf(f, "?\n") |
182 |
|
|
183 |
|
// Prototypes |
184 |
|
static void disass4(FILE *f, unsigned int adr, unsigned int w); |
422 |
|
static void disass4(FILE *f, unsigned int adr, unsigned int w) |
423 |
|
{ |
424 |
|
switch (vxop) { |
425 |
+ |
case 1540: |
426 |
+ |
if (ra == 0 && rb == 0) |
427 |
+ |
fprintf(f, "mfvscr\tv%d\n", rd); |
428 |
+ |
else |
429 |
+ |
fprintf(f, "?\n"); |
430 |
+ |
break; |
431 |
+ |
case 1604: |
432 |
+ |
if (rd == 0 && ra == 0) |
433 |
+ |
fprintf(f, "mtvscr\tv%d\n", rb); |
434 |
+ |
else |
435 |
+ |
fprintf(f, "?\n"); |
436 |
+ |
break; |
437 |
|
case 384: vx_form("vaddcuw"); break; |
438 |
|
case 10: vx_form("vaddfp"); break; |
439 |
|
case 768: vx_form("vaddsbs"); break; |
453 |
|
case 1026: vx_form("vavgub"); break; |
454 |
|
case 1090: vx_form("vavguh"); break; |
455 |
|
case 1154: vx_form("vavguw"); break; |
456 |
+ |
case 842: vxi_ra_form("vcfsx"); break; |
457 |
+ |
case 778: vxi_ra_form("vcfux"); break; |
458 |
+ |
case 966: case 966+1024: vxr_form("vcmpbfp"); break; |
459 |
+ |
case 198: case 198+1024: vxr_form("vcmpeqfp"); break; |
460 |
+ |
case 6: case 6+1024: vxr_form("vcmpequb"); break; |
461 |
+ |
case 70: case 70+1024: vxr_form("vcmpequh"); break; |
462 |
+ |
case 134: case 134+1024: vxr_form("vcmpequw"); break; |
463 |
+ |
case 454: case 454+1024: vxr_form("vcmpgefp"); break; |
464 |
+ |
case 710: case 710+1024: vxr_form("vcmpgtfp"); break; |
465 |
+ |
case 774: case 774+1024: vxr_form("vcmpgtsb"); break; |
466 |
+ |
case 838: case 838+1024: vxr_form("vcmpgtsh"); break; |
467 |
+ |
case 902: case 902+1024: vxr_form("vcmpgtsw"); break; |
468 |
+ |
case 518: case 518+1024: vxr_form("vcmpgtub"); break; |
469 |
+ |
case 582: case 582+1024: vxr_form("vcmpgtuh"); break; |
470 |
+ |
case 646: case 646+1024: vxr_form("vcmpgtuw"); break; |
471 |
+ |
case 970: vxi_ra_form("vctsxs"); break; |
472 |
+ |
case 906: vxi_ra_form("vctuxs"); break; |
473 |
+ |
case 394: vx_raz_form("vexptefp"); break; |
474 |
+ |
case 458: vx_raz_form("vlogefp"); break; |
475 |
|
case 1034: vx_form("vmaxfp"); break; |
476 |
|
case 258: vx_form("vmaxsb"); break; |
477 |
|
case 322: vx_form("vmaxsh"); break; |
478 |
|
case 386: vx_form("vmaxsw"); break; |
479 |
|
case 2: vx_form("vmaxub"); break; |
480 |
< |
case 66: vx_form("vmaxus"); break; |
480 |
> |
case 66: vx_form("vmaxuh"); break; |
481 |
|
case 130: vx_form("vmaxuw"); break; |
482 |
|
case 1098: vx_form("vminfp"); break; |
483 |
|
case 770: vx_form("vminsb"); break; |
502 |
|
case 72: vx_form("vmulouh"); break; |
503 |
|
case 1284: vx_form("vnor"); break; |
504 |
|
case 1156: vx_form("vor"); break; |
463 |
– |
case 1220: vx_form("vxor"); break; |
505 |
|
case 782: vx_form("vpkpx"); break; |
506 |
|
case 398: vx_form("vpkshss"); break; |
507 |
|
case 270: vx_form("vpkshus"); break; |
511 |
|
case 142: vx_form("vpkuhus"); break; |
512 |
|
case 78: vx_form("vpkuwum"); break; |
513 |
|
case 206: vx_form("vpkuwus"); break; |
514 |
+ |
case 266: vx_raz_form("vrefp"); break; |
515 |
+ |
case 714: vx_raz_form("vrfim"); break; |
516 |
+ |
case 522: vx_raz_form("vrfin"); break; |
517 |
+ |
case 650: vx_raz_form("vrfip"); break; |
518 |
+ |
case 586: vx_raz_form("vrfiz"); break; |
519 |
|
case 4: vx_form("vrlb"); break; |
520 |
|
case 68: vx_form("vrlh"); break; |
521 |
|
case 132: vx_form("vrlw"); break; |
522 |
+ |
case 330: vx_raz_form("vrsqrtefp"); break; |
523 |
|
case 452: vx_form("vsl"); break; |
524 |
|
case 260: vx_form("vslb"); break; |
525 |
|
case 324: vx_form("vslh"); break; |
526 |
|
case 1036: vx_form("vslo"); break; |
527 |
|
case 388: vx_form("vslw"); break; |
528 |
+ |
case 524: vxi_ra_form("vspltb"); break; |
529 |
+ |
case 588: vxi_ra_form("vsplth"); break; |
530 |
+ |
case 780: vxi_ras_rbz_form("vspltisb"); break; |
531 |
+ |
case 844: vxi_ras_rbz_form("vspltish"); break; |
532 |
+ |
case 908: vxi_ras_rbz_form("vspltisw"); break; |
533 |
+ |
case 652: vxi_ra_form("vspltw"); break; |
534 |
|
case 708: vx_form("vsr"); break; |
535 |
|
case 772: vx_form("vsrab"); break; |
536 |
|
case 836: vx_form("vsrah"); break; |
555 |
|
case 1800: vx_form("vsum4sbs"); break; |
556 |
|
case 1608: vx_form("vsum4shs"); break; |
557 |
|
case 1544: vx_form("vsum4ubs"); break; |
558 |
+ |
case 846: vx_raz_form("vupkhpx"); break; |
559 |
+ |
case 526: vx_raz_form("vupkhsb"); break; |
560 |
+ |
case 590: vx_raz_form("vupkhsh"); break; |
561 |
+ |
case 974: vx_raz_form("vupklpx"); break; |
562 |
+ |
case 654: vx_raz_form("vupklsb"); break; |
563 |
+ |
case 718: vx_raz_form("vupklsh"); break; |
564 |
+ |
case 1220: vx_form("vxor"); break; |
565 |
|
default: |
566 |
< |
if ((vxop & 0x43f) == 44) { |
567 |
< |
vxi_form("vsldoi"); |
566 |
> |
if ((vxop & 0x43f) == 44) { // vsldoi vD,vA,vB,SHB |
567 |
> |
fprintf(f, "vsldoi\tv%d,v%d,v%d,%d\n", rd, ra, rb, rc & 15); |
568 |
|
break; |
569 |
|
} |
570 |
< |
fprintf(f, "?\n"); |
570 |
> |
switch (vxop & 0x3f) { // VA-form, must come last |
571 |
> |
case 46: va_form("vmaddfp"); break; |
572 |
> |
case 32: va_form("vmhaddshs"); break; |
573 |
> |
case 33: va_form("vmhraddshs"); break; |
574 |
> |
case 34: va_form("vmladduhm"); break; |
575 |
> |
case 37: va_form("vmsummbm"); break; |
576 |
> |
case 40: va_form("vmsumshm"); break; |
577 |
> |
case 41: va_form("vmsumshs"); break; |
578 |
> |
case 36: va_form("vmsumubm"); break; |
579 |
> |
case 38: va_form("vmsumuhm"); break; |
580 |
> |
case 39: va_form("vmsumuhs"); break; |
581 |
> |
case 47: va_form("vnmsubfp"); break; |
582 |
> |
case 43: va_form("vperm"); break; |
583 |
> |
case 42: va_form("vsel"); break; |
584 |
> |
default: fprintf(f, "?\n"); break; |
585 |
> |
} |
586 |
|
break; |
587 |
|
} |
588 |
|
} |
830 |
|
case 359: xform_vls("lvxl"); break; |
831 |
|
case 370: xform("tlbia"); break; |
832 |
|
|
833 |
+ |
case 822: // AltiVec |
834 |
+ |
if ((rd & 0xc) == 0 && ra == 0 && rb == 0 && (w & 1) == 0) { |
835 |
+ |
if (rd & 0x10) |
836 |
+ |
fprintf(f, "dssall\n"); |
837 |
+ |
else |
838 |
+ |
fprintf(f, "dss\t%d\n", rd & 3); |
839 |
+ |
} |
840 |
+ |
else |
841 |
+ |
fprintf(f, "?\n"); |
842 |
+ |
break; |
843 |
+ |
|
844 |
+ |
case 342: // AltiVec |
845 |
+ |
if ((rd & 0xc) == 0 && (w & 1) == 0) |
846 |
+ |
fprintf(f, "dst%s\tr%d,r%d,%d\n", rd & 0x10 ? "t" : "", ra, rb, rd & 3); |
847 |
+ |
else |
848 |
+ |
fprintf(f, "?\n"); |
849 |
+ |
break; |
850 |
+ |
|
851 |
+ |
case 374: // AltiVec |
852 |
+ |
if ((rd & 0xc) == 0 && (w & 1) == 0) |
853 |
+ |
fprintf(f, "dstst%s\tr%d,r%d,%d\n", rd & 0x10 ? "t" : "", ra, rb, rd & 3); |
854 |
+ |
else |
855 |
+ |
fprintf(f, "?\n"); |
856 |
+ |
break; |
857 |
+ |
|
858 |
|
case 371: |
859 |
|
if ((ra | (rb << 5)) == 268) |
860 |
|
xfxform_tb("mftb"); |