Module: wine Branch: master Commit: 7c9cd44965c55ea4df13584d32cde1376ad761af URL: http://source.winehq.org/git/wine.git/?a=commit;h=7c9cd44965c55ea4df13584d32...
Author: Eric Pouech eric.pouech@orange.fr Date: Wed Feb 3 21:47:34 2010 +0100
winedbg: Added some more instructions disassembly.
---
programs/winedbg/db_disasm64.c | 83 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 80 insertions(+), 3 deletions(-)
diff --git a/programs/winedbg/db_disasm64.c b/programs/winedbg/db_disasm64.c index cb1a174..7cb3475 100644 --- a/programs/winedbg/db_disasm64.c +++ b/programs/winedbg/db_disasm64.c @@ -155,6 +155,11 @@ static void db_printsym(db_addr_t addr, unsigned unused) #define Ril 36 /* long register in instruction */ #define Iba 37 /* byte immediate, don't print if 0xa */ #define EL 38 /* address, explicitly long size */ +/* Wine extensions */ +#define MX 39 /* special register (MMX reg %mm0-7) */ +#define EMX 40 /* special register (MMX reg %mm0-7) */ +#define XMM 41 /* special register (floating point reg %xmm0-7) */ +#define EXMM 42 /* special register (floating point reg %xmm0-7) */
struct inst { const char * i_name; /* name */ @@ -322,6 +327,66 @@ static const struct inst db_inst_0f4x[] = { /*4f*/ { "cmovnle",TRUE, NONE, op2(E, R), 0 }, };
+static const struct inst db_inst_0f5x[] = { +/*50*/ { "movmskps",TRUE, NONE, op2(E, XMM), 0 }, +/*51*/ { "sqrtps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*52*/ { "rsqrtps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*53*/ { "rcpps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*54*/ { "andps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*55*/ { "andnps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*56*/ { "orps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*57*/ { "xorps", TRUE, NONE, op2(XMM, EXMM), 0 }, + +/*58*/ { "addps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*59*/ { "mulps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*5a*/ { "(bad)", FALSE, NONE, 0, 0 }, +/*5b*/ { "(bad)", FALSE, NONE, 0, 0 }, +/*5c*/ { "subps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*5d*/ { "minps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*5e*/ { "divps", TRUE, NONE, op2(XMM, EXMM), 0 }, +/*5f*/ { "maxps", TRUE, NONE, op2(XMM, EXMM), 0 }, +}; + +static const struct inst db_inst_0f6x[] = { +/*60*/ { "punpcklbw", TRUE, NONE, op2(E, MX), 0 }, +/*61*/ { "punpcklwd", TRUE, NONE, op2(E, MX), 0 }, +/*62*/ { "punpckldq", TRUE, NONE, op2(E, MX), 0 }, +/*63*/ { "packsswb", TRUE, NONE, op2(E, MX), 0 }, +/*64*/ { "pcmpgtb", TRUE, NONE, op2(E, MX), 0 }, +/*65*/ { "pcmpgtw", TRUE, NONE, op2(E, MX), 0 }, +/*66*/ { "pcmpgtd", TRUE, NONE, op2(E, MX), 0 }, +/*67*/ { "packuswb", TRUE, NONE, op2(E, MX), 0 }, + +/*68*/ { "punpckhbw", TRUE, NONE, op2(E, MX), 0 }, +/*69*/ { "punpckhwd", TRUE, NONE, op2(E, MX), 0 }, +/*6a*/ { "punpckhdq", TRUE, NONE, op2(E, MX), 0 }, +/*6b*/ { "packssdw", TRUE, NONE, op2(E, MX), 0 }, +/*6c*/ { "(bad)", TRUE, NONE, 0, 0 }, +/*6d*/ { "(bad)", TRUE, NONE, 0, 0 }, +/*6e*/ { "movd", TRUE, NONE, op2(E, MX), 0 }, +/*6f*/ { "movq", TRUE, NONE, op2(E, MX), 0 }, +}; + +static const struct inst db_inst_0f7x[] = { +/*70*/ { "pshufw", TRUE, NONE, op2(MX, EMX), 0 }, +/*71*/ { "(bad)", TRUE, NONE, 0, 0 }, /* FIXME: grp 12 */ +/*72*/ { "(bad)", TRUE, NONE, 0, 0 }, /* FIXME: grp 13 */ +/*73*/ { "(bad)", TRUE, NONE, 0, 0 }, /* FIXME: grp 14 */ +/*74*/ { "pcmpeqb", TRUE, NONE, op2(E, MX), 0 }, +/*75*/ { "pcmpeqw", TRUE, NONE, op2(E, MX), 0 }, +/*76*/ { "pcmpeqd", TRUE, NONE, op2(E, MX), 0 }, +/*77*/ { "emms", FALSE,NONE, 0, 0 }, + +/*78*/ { "(bad)", TRUE, NONE, 0, 0 }, +/*79*/ { "(bad)", TRUE, NONE, 0, 0 }, +/*7a*/ { "(bad)", TRUE, NONE, 0, 0 }, +/*7b*/ { "(bad)", TRUE, NONE, 0, 0 }, +/*7c*/ { "(bad)", TRUE, NONE, 0, 0 }, +/*7d*/ { "(bad)", TRUE, NONE, 0, 0 }, +/*7e*/ { "movd", TRUE, NONE, op2(E, MX), 0 }, +/*7f*/ { "movq", TRUE, NONE, op2(EMX, MX), 0 }, +}; + static const struct inst db_inst_0f8x[] = { /*80*/ { "jo", FALSE, NONE, op1(Dl), 0 }, /*81*/ { "jno", FALSE, NONE, op1(Dl), 0 }, @@ -427,9 +492,9 @@ static const struct inst * const db_inst_0f[] = { db_inst_0f2x, db_inst_0f3x, db_inst_0f4x, - 0, - 0, - 0, + db_inst_0f5x, + db_inst_0f6x, + db_inst_0f7x, db_inst_0f8x, db_inst_0f9x, db_inst_0fax, @@ -1558,6 +1623,18 @@ db_disasm(db_addr_t loc, boolean_t altfmt) get_value_inc(imm2, loc, 2, FALSE); /* segment */ db_printf("$%#x,%#x", imm2, imm); break; + case MX: + db_printf("%%mm%d", f_reg(rex, regmodrm)); + break; + case EMX: + db_printf("%%mm%d", f_rm(rex, regmodrm)); + break; + case XMM: + db_printf("%%xmm%d", f_reg(rex, regmodrm)); + break; + case EXMM: + db_printf("%%xmm%d", f_rm(rex, regmodrm)); + break; } } return (loc);