--- mon/src/mon_ppc.cpp 2005/03/13 17:09:19 1.9 +++ mon/src/mon_ppc.cpp 2006/03/13 12:15:23 1.10 @@ -165,9 +165,20 @@ static char *to_code[32] = { #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)) -#define vx_form(s) fprintf(f, "%s\tv%d,v%d,v%d\n", s, rd, ra, rb) -#define vxi_form(s) fprintf(f, "%s\tv%d,v%d,v%d,%d\n", s, rd, ra, rb, (rc & 15)) #define va_form(s) fprintf(f, "%s\tv%d,v%d,v%d,v%d\n", s, rd, ra, rb, rc) +#define vx_form(s) fprintf(f, "%s\tv%d,v%d,v%d\n", s, rd, ra, rb) +#define vxr_form(s) fprintf(f, "%s%s\tv%d,v%d,v%d\n", s, w & (1 << 10) ? "." : "", rd, ra, rb) +#define vxi_ra_form(s) fprintf(f, "%s\tv%d,v%d,%d\n", s, rd, rb, ra) +#define vx_raz_form(s) \ + if (ra == 0) \ + fprintf(f, "%s\tv%d,v%d\n", s, rd, rb); \ + else \ + fprintf(f, "?\n") +#define vxi_ras_rbz_form(s) \ + if (rb == 0) \ + fprintf(f, "%s\tv%d,%d\n", s, rd, ra - (ra & 0x10 ? 0x20 : 0)); \ + else \ + fprintf(f, "?\n") // Prototypes static void disass4(FILE *f, unsigned int adr, unsigned int w); @@ -411,6 +422,18 @@ void disass_ppc(FILE *f, unsigned int ad static void disass4(FILE *f, unsigned int adr, unsigned int w) { switch (vxop) { + case 1540: + if (ra == 0 && rb == 0) + fprintf(f, "mfvscr\tv%d\n", rd); + else + fprintf(f, "?\n"); + break; + case 1604: + if (rd == 0 && ra == 0) + fprintf(f, "mtvscr\tv%d\n", rb); + else + fprintf(f, "?\n"); + break; case 384: vx_form("vaddcuw"); break; case 10: vx_form("vaddfp"); break; case 768: vx_form("vaddsbs"); break; @@ -430,12 +453,31 @@ static void disass4(FILE *f, unsigned in case 1026: vx_form("vavgub"); break; case 1090: vx_form("vavguh"); break; case 1154: vx_form("vavguw"); break; + case 842: vxi_ra_form("vcfsx"); break; + case 778: vxi_ra_form("vcfux"); break; + case 966: case 966+1024: vxr_form("vcmpbfp"); break; + case 198: case 198+1024: vxr_form("vcmpeqfp"); break; + case 6: case 6+1024: vxr_form("vcmpequb"); break; + case 70: case 70+1024: vxr_form("vcmpequh"); break; + case 134: case 134+1024: vxr_form("vcmpequw"); break; + case 454: case 454+1024: vxr_form("vcmpgefp"); break; + case 710: case 710+1024: vxr_form("vcmpgtfp"); break; + case 774: case 774+1024: vxr_form("vcmpgtsb"); break; + case 838: case 838+1024: vxr_form("vcmpgtsh"); break; + case 902: case 902+1024: vxr_form("vcmpgtsw"); break; + case 518: case 518+1024: vxr_form("vcmpgtub"); break; + case 582: case 582+1024: vxr_form("vcmpgtuh"); break; + case 646: case 646+1024: vxr_form("vcmpgtuw"); break; + case 970: vxi_ra_form("vctsxs"); break; + case 906: vxi_ra_form("vctuxs"); break; + case 394: vx_raz_form("vexptefp"); break; + case 458: vx_raz_form("vlogefp"); break; case 1034: vx_form("vmaxfp"); break; case 258: vx_form("vmaxsb"); break; case 322: vx_form("vmaxsh"); break; case 386: vx_form("vmaxsw"); break; case 2: vx_form("vmaxub"); break; - case 66: vx_form("vmaxus"); break; + case 66: vx_form("vmaxuh"); break; case 130: vx_form("vmaxuw"); break; case 1098: vx_form("vminfp"); break; case 770: vx_form("vminsb"); break; @@ -460,7 +502,6 @@ static void disass4(FILE *f, unsigned in case 72: vx_form("vmulouh"); break; case 1284: vx_form("vnor"); break; case 1156: vx_form("vor"); break; - case 1220: vx_form("vxor"); break; case 782: vx_form("vpkpx"); break; case 398: vx_form("vpkshss"); break; case 270: vx_form("vpkshus"); break; @@ -470,14 +511,26 @@ static void disass4(FILE *f, unsigned in case 142: vx_form("vpkuhus"); break; case 78: vx_form("vpkuwum"); break; case 206: vx_form("vpkuwus"); break; + case 266: vx_raz_form("vrefp"); break; + case 714: vx_raz_form("vrfim"); break; + case 522: vx_raz_form("vrfin"); break; + case 650: vx_raz_form("vrfip"); break; + case 586: vx_raz_form("vrfiz"); break; case 4: vx_form("vrlb"); break; case 68: vx_form("vrlh"); break; case 132: vx_form("vrlw"); break; + case 330: vx_raz_form("vrsqrtefp"); break; case 452: vx_form("vsl"); break; case 260: vx_form("vslb"); break; case 324: vx_form("vslh"); break; case 1036: vx_form("vslo"); break; case 388: vx_form("vslw"); break; + case 524: vxi_ra_form("vspltb"); break; + case 588: vxi_ra_form("vsplth"); break; + case 780: vxi_ras_rbz_form("vspltisb"); break; + case 844: vxi_ras_rbz_form("vspltish"); break; + case 908: vxi_ras_rbz_form("vspltisw"); break; + case 652: vxi_ra_form("vspltw"); break; case 708: vx_form("vsr"); break; case 772: vx_form("vsrab"); break; case 836: vx_form("vsrah"); break; @@ -502,12 +555,34 @@ static void disass4(FILE *f, unsigned in case 1800: vx_form("vsum4sbs"); break; case 1608: vx_form("vsum4shs"); break; case 1544: vx_form("vsum4ubs"); break; + case 846: vx_raz_form("vupkhpx"); break; + case 526: vx_raz_form("vupkhsb"); break; + case 590: vx_raz_form("vupkhsh"); break; + case 974: vx_raz_form("vupklpx"); break; + case 654: vx_raz_form("vupklsb"); break; + case 718: vx_raz_form("vupklsh"); break; + case 1220: vx_form("vxor"); break; default: - if ((vxop & 0x43f) == 44) { - vxi_form("vsldoi"); + if ((vxop & 0x43f) == 44) { // vsldoi vD,vA,vB,SHB + fprintf(f, "vsldoi\tv%d,v%d,v%d,%d\n", rd, ra, rb, rc & 15); break; } - fprintf(f, "?\n"); + switch (vxop & 0x3f) { // VA-form, must come last + case 46: va_form("vmaddfp"); break; + case 32: va_form("vmhaddshs"); break; + case 33: va_form("vmhraddshs"); break; + case 34: va_form("vmladduhm"); break; + case 37: va_form("vmsummbm"); break; + case 40: va_form("vmsumshm"); break; + case 41: va_form("vmsumshs"); break; + case 36: va_form("vmsumubm"); break; + case 38: va_form("vmsumuhm"); break; + case 39: va_form("vmsumuhs"); break; + case 47: va_form("vnmsubfp"); break; + case 43: va_form("vperm"); break; + case 42: va_form("vsel"); break; + default: fprintf(f, "?\n"); break; + } break; } } @@ -755,6 +830,31 @@ static void disass31(FILE *f, unsigned i case 359: xform_vls("lvxl"); break; case 370: xform("tlbia"); break; + case 822: // AltiVec + if ((rd & 0xc) == 0 && ra == 0 && rb == 0 && (w & 1) == 0) { + if (rd & 0x10) + fprintf(f, "dssall\n"); + else + fprintf(f, "dss\t%d\n", rd & 3); + } + else + fprintf(f, "?\n"); + break; + + case 342: // AltiVec + if ((rd & 0xc) == 0 && (w & 1) == 0) + fprintf(f, "dst%s\tr%d,r%d,%d\n", rd & 0x10 ? "t" : "", ra, rb, rd & 3); + else + fprintf(f, "?\n"); + break; + + case 374: // AltiVec + if ((rd & 0xc) == 0 && (w & 1) == 0) + fprintf(f, "dstst%s\tr%d,r%d,%d\n", rd & 0x10 ? "t" : "", ra, rb, rd & 3); + else + fprintf(f, "?\n"); + break; + case 371: if ((ra | (rb << 5)) == 268) xfxform_tb("mftb");