Eric Pouech : winedbg: Added some more instructions disassembly.
Alexandre Julliard
julliard at winehq.org
Thu Feb 4 11:11:00 CST 2010
Module: wine
Branch: master
Commit: 7c9cd44965c55ea4df13584d32cde1376ad761af
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7c9cd44965c55ea4df13584d32cde1376ad761af
Author: Eric Pouech <eric.pouech at 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);
More information about the wine-cvs
mailing list