Mon Jun 16 14:08:38 1997 Michael Taylor <mbt@mit.edu>

* i386-dis.c (dis386_twobyte): Fix pand and pandn.
This commit is contained in:
Ian Lance Taylor 1997-06-16 18:09:28 +00:00
parent b0447a0e80
commit eedca9daa9
2 changed files with 197 additions and 50 deletions

View File

@ -1,3 +1,7 @@
Mon Jun 16 14:08:38 1997 Michael Taylor <mbt@mit.edu>
* i386-dis.c (dis386_twobyte): Fix pand and pandn.
Tue Jun 10 11:26:47 1997 H.J. Lu <hjl@gnu.ai.mit.edu>
* arm-dis.c: Add prototypes for arm_decode_shift and

View File

@ -144,6 +144,10 @@ fetch_data (info, addr)
#define fs OP_REG, fs_reg
#define gs OP_REG, gs_reg
#define MX OP_MMX, 0
#define EM OP_EM, v_mode
#define MS OP_MS, b_mode
typedef int (*op_rtn) PARAMS ((int bytemode, int aflag, int dflag));
static int OP_E PARAMS ((int, int, int));
@ -167,6 +171,9 @@ static int OP_STi PARAMS ((int, int, int));
#if 0
static int OP_ONE PARAMS ((int, int, int));
#endif
static int OP_MMX PARAMS ((int, int, int));
static int OP_EM PARAMS ((int, int, int));
static int OP_MS PARAMS ((int, int, int));
static void append_prefix PARAMS ((void));
static void set_op PARAMS ((int op));
@ -235,6 +242,9 @@ static void ckprefix PARAMS ((void));
#define GRP7 NULL, NULL, 14
#define GRP8 NULL, NULL, 15
#define GRP9 NULL, NULL, 16
#define GRP10 NULL, NULL, 17
#define GRP11 NULL, NULL, 18
#define GRP12 NULL, NULL, 19
#define FLOATCODE 50
#define FLOAT NULL, NULL, FLOATCODE
@ -257,8 +267,8 @@ static struct dis386 dis386[] = {
{ "addS", Gv, Ev },
{ "addb", AL, Ib },
{ "addS", eAX, Iv },
{ "pushl", es },
{ "popl", es },
{ "pushS", es },
{ "popS", es },
/* 08 */
{ "orb", Eb, Gb },
{ "orS", Ev, Gv },
@ -266,7 +276,7 @@ static struct dis386 dis386[] = {
{ "orS", Gv, Ev },
{ "orb", AL, Ib },
{ "orS", eAX, Iv },
{ "pushl", cs },
{ "pushS", cs },
{ "(bad)" }, /* 0x0f extended opcode escape */
/* 10 */
{ "adcb", Eb, Gb },
@ -275,8 +285,8 @@ static struct dis386 dis386[] = {
{ "adcS", Gv, Ev },
{ "adcb", AL, Ib },
{ "adcS", eAX, Iv },
{ "pushl", ss },
{ "popl", ss },
{ "pushS", ss },
{ "popS", ss },
/* 18 */
{ "sbbb", Eb, Gb },
{ "sbbS", Ev, Gv },
@ -284,8 +294,8 @@ static struct dis386 dis386[] = {
{ "sbbS", Gv, Ev },
{ "sbbb", AL, Ib },
{ "sbbS", eAX, Iv },
{ "pushl", ds },
{ "popl", ds },
{ "pushS", ds },
{ "popS", ds },
/* 20 */
{ "andb", Eb, Gb },
{ "andS", Ev, Gv },
@ -370,7 +380,7 @@ static struct dis386 dis386[] = {
/* 68 */
{ "pushS", Iv }, /* 386 book wrong */
{ "imulS", Gv, Ev, Iv },
{ "pushl", sIb }, /* push of byte really pushes 4 bytes */
{ "pushS", sIb }, /* push of byte really pushes 2 or 4 bytes */
{ "imulS", Gv, Ev, Ib },
{ "insb", Yb, indirDX },
{ "insS", Yv, indirDX },
@ -422,8 +432,8 @@ static struct dis386 dis386[] = {
{ "xchgS", eSI, eAX },
{ "xchgS", eDI, eAX },
/* 98 */
{ "cwtl" },
{ "cltd" },
{ "cWtS" },
{ "cStd" },
{ "lcall", Ap },
{ "(bad)" }, /* fwait */
{ "pushf" },
@ -593,17 +603,36 @@ static struct dis386 dis386_twobyte[] = {
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
/* 60 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "punpcklbw", MX, EM },
{ "punpcklwd", MX, EM },
{ "punpckldq", MX, EM },
{ "packsswb", MX, EM },
{ "pcmpgtb", MX, EM },
{ "pcmpgtw", MX, EM },
{ "pcmpgtd", MX, EM },
{ "packuswb", MX, EM },
/* 68 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "punpckhbw", MX, EM },
{ "punpckhwd", MX, EM },
{ "punpckhdq", MX, EM },
{ "packssdw", MX, EM },
{ "(bad)" }, { "(bad)" },
{ "movd", MX, Ev },
{ "movq", MX, EM },
/* 70 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" },
{ GRP10 },
{ GRP11 },
{ GRP12 },
{ "pcmpeqb", MX, EM },
{ "pcmpeqw", MX, EM },
{ "pcmpeqd", MX, EM },
{ "emms" },
/* 78 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" },
{ "movd", Ev, MX },
{ "movq", EM, MX },
/* 80 */
{ "jo", Jv },
{ "jno", Jv },
@ -641,8 +670,8 @@ static struct dis386 dis386_twobyte[] = {
{ "setle", Eb },
{ "setg", Eb },
/* a0 */
{ "pushl", fs },
{ "popl", fs },
{ "pushS", fs },
{ "popS", fs },
{ "cpuid" },
{ "btS", Ev, Gv },
{ "shldS", Ev, Gv, Ib },
@ -650,8 +679,8 @@ static struct dis386 dis386_twobyte[] = {
{ "(bad)" },
{ "(bad)" },
/* a8 */
{ "pushl", gs },
{ "popl", gs },
{ "pushS", gs },
{ "popS", gs },
{ "rsm" },
{ "btsS", Ev, Gv },
{ "shrdS", Ev, Gv, Ib },
@ -695,23 +724,56 @@ static struct dis386 dis386_twobyte[] = {
{ "bswap", eSI },
{ "bswap", eDI },
/* d0 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" },
{ "psrlw", MX, EM },
{ "psrld", MX, EM },
{ "psrlq", MX, EM },
{ "(bad)" },
{ "pmullw", MX, EM },
{ "(bad)" }, { "(bad)" },
/* d8 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "psubusb", MX, EM },
{ "psubusw", MX, EM },
{ "(bad)" },
{ "pand", MX, EM },
{ "paddusb", MX, EM },
{ "paddusw", MX, EM },
{ "(bad)" },
{ "pandn", MX, EM },
/* e0 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" },
{ "psraw", MX, EM },
{ "psrad", MX, EM },
{ "(bad)" },
{ "(bad)" },
{ "pmulhw", MX, EM },
{ "(bad)" }, { "(bad)" },
/* e8 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "psubsb", MX, EM },
{ "psubsw", MX, EM },
{ "(bad)" },
{ "por", MX, EM },
{ "paddsb", MX, EM },
{ "paddsw", MX, EM },
{ "(bad)" },
{ "pxor", MX, EM },
/* f0 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" },
{ "psllw", MX, EM },
{ "pslld", MX, EM },
{ "psllq", MX, EM },
{ "(bad)" },
{ "pmaddwd", MX, EM },
{ "(bad)" }, { "(bad)" },
/* f8 */
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" },
{ "psubb", MX, EM },
{ "psubw", MX, EM },
{ "psubd", MX, EM },
{ "(bad)" },
{ "paddb", MX, EM },
{ "paddw", MX, EM },
{ "paddd", MX, EM },
{ "(bad)" }
};
static const unsigned char onebyte_has_modrm[256] = {
@ -734,22 +796,22 @@ static const unsigned char onebyte_has_modrm[256] = {
};
static const unsigned char twobyte_has_modrm[256] = {
1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
/* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
/* 10 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
/* 20 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* 2f */
/* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
/* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
/* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 5f */
/* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1, /* 6f */
/* 70 */ 0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1, /* 7f */
/* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
/* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
/* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
/* b0 */ 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* bf */
/* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
/* d0 */ 0,1,1,1,0,1,0,0,1,1,1,0,1,1,0,1, /* df */
/* e0 */ 0,1,1,0,0,1,0,0,1,1,0,1,1,1,0,1, /* ef */
/* f0 */ 0,1,1,1,0,1,0,0,1,1,1,0,1,1,1,0 /* ff */
};
static char obuf[100];
@ -966,6 +1028,39 @@ static struct dis386 grps[][8] = {
{ "(bad)" },
{ "(bad)" },
{ "(bad)" },
},
/* GRP10 */
{
{ "(bad)" },
{ "(bad)" },
{ "psrlw", MS, Ib },
{ "(bad)" },
{ "psraw", MS, Ib },
{ "(bad)" },
{ "psllw", MS, Ib },
{ "(bad)" },
},
/* GRP11 */
{
{ "(bad)" },
{ "(bad)" },
{ "psrld", MS, Ib },
{ "(bad)" },
{ "psrad", MS, Ib },
{ "(bad)" },
{ "pslld", MS, Ib },
{ "(bad)" },
},
/* GRP12 */
{
{ "(bad)" },
{ "(bad)" },
{ "psrlq", MS, Ib },
{ "(bad)" },
{ "(bad)" },
{ "(bad)" },
{ "psllq", MS, Ib },
{ "(bad)" },
}
};
@ -1134,7 +1229,10 @@ print_insn_x86 (pc, info, aflag, dflag)
if (prefixes & PREFIX_ADR)
{
aflag ^= 1;
oappend ("addr16 ");
if (aflag)
oappend ("addr32 ");
else
oappend ("addr16 ");
}
if (*codep == 0x0f)
@ -1565,6 +1663,13 @@ putop (template, aflag, dflag)
else
*obufp++ = 'w';
break;
case 'W':
/* operand size flag for cwtl, cbtw */
if (dflag)
*obufp++ = 'w';
else
*obufp++ = 'b';
break;
}
}
*obufp = 0;
@ -2118,3 +2223,41 @@ OP_rm (bytemode, aflag, dflag)
}
return (0);
}
static int
OP_MMX (bytemode, aflag, dflag)
int bytemode;
int aflag;
int dflag;
{
sprintf (scratchbuf, "%%mm%d", reg);
oappend (scratchbuf);
return 0;
}
static int
OP_EM (bytemode, aflag, dflag)
int bytemode;
int aflag;
int dflag;
{
if (mod != 3)
return OP_E (bytemode, aflag, dflag);
codep++;
sprintf (scratchbuf, "%%mm%d", rm);
oappend (scratchbuf);
return 0;
}
static int
OP_MS (bytemode, aflag, dflag)
int bytemode;
int aflag;
int dflag;
{
++codep;
sprintf (scratchbuf, "%%mm%d", rm);
oappend (scratchbuf);
return 0;
}