Fri Jun 5 23:47:55 1998 Alan Modra <alan@spri.levels.unisa.edu.au>

* i386-dis.c:  Combine aflag and dflag into sizeflag.  Change OP_*
	functions to void.
	(OP_DSreg): Rename from OP_DSSI.
	(OP_ESreg): Rename from OP_ESDI.
	(Xb, Xv, Yb, Yv): Use index reg code, not b_mode or v_mode.
	(DSBX): Define.
	(append_seg): Rename from append_prefix.
	(ptr_reg): New function.
	(dis386): Add S suffix to pushf, popf, ret, lret, enter, leave.
	Add DSBX for xlat.
	(PREFIX_ADDR): Rename from PREFIX_ADR.
	(float_reg): Add non-broken opcodes for people who don't want
	UNIXWARE_COMPAT.
This commit is contained in:
Ian Lance Taylor
1998-06-06 03:54:24 +00:00
parent ed44fb7a0d
commit 80119c9ee4
2 changed files with 237 additions and 226 deletions

View File

@ -1,3 +1,19 @@
Fri Jun 5 23:47:55 1998 Alan Modra <alan@spri.levels.unisa.edu.au>
* i386-dis.c: Combine aflag and dflag into sizeflag. Change OP_*
functions to void.
(OP_DSreg): Rename from OP_DSSI.
(OP_ESreg): Rename from OP_ESDI.
(Xb, Xv, Yb, Yv): Use index reg code, not b_mode or v_mode.
(DSBX): Define.
(append_seg): Rename from append_prefix.
(ptr_reg): New function.
(dis386): Add S suffix to pushf, popf, ret, lret, enter, leave.
Add DSBX for xlat.
(PREFIX_ADDR): Rename from PREFIX_ADR.
(float_reg): Add non-broken opcodes for people who don't want
UNIXWARE_COMPAT.
Fri Jun 5 19:15:04 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> Fri Jun 5 19:15:04 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* m68k-opc.c (tstb, tstw, tstl): Don't allow pcrel on * m68k-opc.c (tstb, tstw, tstl): Don't allow pcrel on

View File

@ -35,11 +35,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "dis-asm.h" #include "dis-asm.h"
#include "sysdep.h" #include "sysdep.h"
#include "opintl.h"
#define MAXLEN 20 #define MAXLEN 20
#include <setjmp.h> #include <setjmp.h>
#ifndef UNIXWARE_COMPAT
/* Set non-zero for broken, compatible instructions. Set to zero for
non-broken opcodes. */
#define UNIXWARE_COMPAT 1
#endif
static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *)); static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
struct dis_private struct dis_private
@ -132,10 +140,11 @@ fetch_data (info, addr)
#define Av OP_DIR, v_mode #define Av OP_DIR, v_mode
#define Ob OP_OFF, b_mode #define Ob OP_OFF, b_mode
#define Ov OP_OFF, v_mode #define Ov OP_OFF, v_mode
#define Xb OP_DSSI, b_mode #define Xb OP_DSreg, eSI_reg
#define Xv OP_DSSI, v_mode #define Xv OP_DSreg, eSI_reg
#define Yb OP_ESDI, b_mode #define Yb OP_ESreg, eDI_reg
#define Yv OP_ESDI, v_mode #define Yv OP_ESreg, eDI_reg
#define DSBX OP_DSreg, eBX_reg
#define es OP_REG, es_reg #define es OP_REG, es_reg
#define ss OP_REG, ss_reg #define ss OP_REG, ss_reg
@ -148,40 +157,45 @@ fetch_data (info, addr)
#define EM OP_EM, v_mode #define EM OP_EM, v_mode
#define MS OP_MS, b_mode #define MS OP_MS, b_mode
typedef int (*op_rtn) PARAMS ((int bytemode, int aflag, int dflag)); /* bits in sizeflag */
#define AFLAG 2
#define DFLAG 1
static int OP_E PARAMS ((int, int, int)); typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag));
static int OP_G PARAMS ((int, int, int));
static int OP_I PARAMS ((int, int, int)); static void OP_E PARAMS ((int, int));
static int OP_indirE PARAMS ((int, int, int)); static void OP_G PARAMS ((int, int));
static int OP_sI PARAMS ((int, int, int)); static void OP_I PARAMS ((int, int));
static int OP_REG PARAMS ((int, int, int)); static void OP_indirE PARAMS ((int, int));
static int OP_J PARAMS ((int, int, int)); static void OP_sI PARAMS ((int, int));
static int OP_DIR PARAMS ((int, int, int)); static void OP_REG PARAMS ((int, int));
static int OP_OFF PARAMS ((int, int, int)); static void OP_J PARAMS ((int, int));
static int OP_ESDI PARAMS ((int, int, int)); static void OP_DIR PARAMS ((int, int));
static int OP_DSSI PARAMS ((int, int, int)); static void OP_OFF PARAMS ((int, int));
static int OP_SEG PARAMS ((int, int, int)); static void OP_ESreg PARAMS ((int, int));
static int OP_C PARAMS ((int, int, int)); static void OP_DSreg PARAMS ((int, int));
static int OP_D PARAMS ((int, int, int)); static void OP_SEG PARAMS ((int, int));
static int OP_T PARAMS ((int, int, int)); static void OP_C PARAMS ((int, int));
static int OP_rm PARAMS ((int, int, int)); static void OP_D PARAMS ((int, int));
static int OP_ST PARAMS ((int, int, int)); static void OP_T PARAMS ((int, int));
static int OP_STi PARAMS ((int, int, int)); static void OP_rm PARAMS ((int, int));
static void OP_ST PARAMS ((int, int));
static void OP_STi PARAMS ((int, int));
#if 0 #if 0
static int OP_ONE PARAMS ((int, int, int)); static void OP_ONE PARAMS ((int, int));
#endif #endif
static int OP_MMX PARAMS ((int, int, int)); static void OP_MMX PARAMS ((int, int));
static int OP_EM PARAMS ((int, int, int)); static void OP_EM PARAMS ((int, int));
static int OP_MS PARAMS ((int, int, int)); static void OP_MS PARAMS ((int, int));
static void append_prefix PARAMS ((void)); static void append_seg PARAMS ((void));
static void set_op PARAMS ((int op)); static void set_op PARAMS ((int op));
static void putop PARAMS ((char *template, int aflag, int dflag)); static void putop PARAMS ((char *template, int sizeflag));
static void dofloat PARAMS ((int aflag, int dflag)); static void dofloat PARAMS ((int sizeflag));
static int get16 PARAMS ((void)); static int get16 PARAMS ((void));
static int get32 PARAMS ((void)); static int get32 PARAMS ((void));
static void ckprefix PARAMS ((void)); static void ckprefix PARAMS ((void));
static void ptr_reg PARAMS ((int, int));
#define b_mode 1 #define b_mode 1
#define v_mode 2 #define v_mode 2
@ -369,8 +383,8 @@ static struct dis386 dis386[] = {
{ "popS", eSI }, { "popS", eSI },
{ "popS", eDI }, { "popS", eDI },
/* 60 */ /* 60 */
{ "pusha" }, { "pushaS" },
{ "popa" }, { "popaS" },
{ "boundS", Gv, Ma }, { "boundS", Gv, Ma },
{ "arpl", Ew, Gw }, { "arpl", Ew, Gw },
{ "(bad)" }, /* seg fs */ { "(bad)" }, /* seg fs */
@ -436,8 +450,8 @@ static struct dis386 dis386[] = {
{ "cStd" }, { "cStd" },
{ "lcall", Ap }, { "lcall", Ap },
{ "(bad)" }, /* fwait */ { "(bad)" }, /* fwait */
{ "pushf" }, { "pushfS" },
{ "popf" }, { "popfS" },
{ "sahf" }, { "sahf" },
{ "lahf" }, { "lahf" },
/* a0 */ /* a0 */
@ -479,17 +493,17 @@ static struct dis386 dis386[] = {
/* c0 */ /* c0 */
{ GRP2b }, { GRP2b },
{ GRP2S }, { GRP2S },
{ "ret", Iw }, { "retS", Iw },
{ "ret" }, { "retS" },
{ "lesS", Gv, Mp }, { "lesS", Gv, Mp },
{ "ldsS", Gv, Mp }, { "ldsS", Gv, Mp },
{ "movb", Eb, Ib }, { "movb", Eb, Ib },
{ "movS", Ev, Iv }, { "movS", Ev, Iv },
/* c8 */ /* c8 */
{ "enter", Iw, Ib }, { "enterS", Iw, Ib },
{ "leave" }, { "leaveS" },
{ "lret", Iw }, { "lretS", Iw },
{ "lret" }, { "lretS" },
{ "int3" }, { "int3" },
{ "int", Ib }, { "int", Ib },
{ "into" }, { "into" },
@ -502,7 +516,7 @@ static struct dis386 dis386[] = {
{ "aam", Ib }, { "aam", Ib },
{ "aad", Ib }, { "aad", Ib },
{ "(bad)" }, { "(bad)" },
{ "xlat" }, { "xlat", DSBX },
/* d8 */ /* d8 */
{ FLOAT }, { FLOAT },
{ FLOAT }, { FLOAT },
@ -1074,7 +1088,7 @@ static struct dis386 grps[][8] = {
#define PREFIX_FS 0x80 #define PREFIX_FS 0x80
#define PREFIX_GS 0x100 #define PREFIX_GS 0x100
#define PREFIX_DATA 0x200 #define PREFIX_DATA 0x200
#define PREFIX_ADR 0x400 #define PREFIX_ADDR 0x400
#define PREFIX_FWAIT 0x800 #define PREFIX_FWAIT 0x800
static int prefixes; static int prefixes;
@ -1119,7 +1133,7 @@ ckprefix ()
prefixes |= PREFIX_DATA; prefixes |= PREFIX_DATA;
break; break;
case 0x67: case 0x67:
prefixes |= PREFIX_ADR; prefixes |= PREFIX_ADDR;
break; break;
case 0x9b: case 0x9b:
prefixes |= PREFIX_FWAIT; prefixes |= PREFIX_FWAIT;
@ -1145,27 +1159,25 @@ static int start_pc;
* The function returns the length of this instruction in bytes. * The function returns the length of this instruction in bytes.
*/ */
int print_insn_x86 PARAMS ((bfd_vma pc, disassemble_info *info, int aflag, int print_insn_x86 PARAMS ((bfd_vma pc, disassemble_info *info, int sizeflag));
int dflag));
int int
print_insn_i386 (pc, info) print_insn_i386 (pc, info)
bfd_vma pc; bfd_vma pc;
disassemble_info *info; disassemble_info *info;
{ {
if (info->mach == bfd_mach_i386_i386) if (info->mach == bfd_mach_i386_i386)
return print_insn_x86 (pc, info, 1, 1); return print_insn_x86 (pc, info, AFLAG|DFLAG);
else if (info->mach == bfd_mach_i386_i8086) else if (info->mach == bfd_mach_i386_i8086)
return print_insn_x86 (pc, info, 0, 0); return print_insn_x86 (pc, info, 0);
else else
abort (); abort ();
} }
int int
print_insn_x86 (pc, info, aflag, dflag) print_insn_x86 (pc, info, sizeflag)
bfd_vma pc; bfd_vma pc;
disassemble_info *info; disassemble_info *info;
int aflag; int sizeflag;
int dflag;
{ {
struct dis386 *dp; struct dis386 *dp;
int i; int i;
@ -1222,16 +1234,16 @@ print_insn_x86 (pc, info, aflag, dflag)
{ {
/* fwait not followed by floating point instruction */ /* fwait not followed by floating point instruction */
(*info->fprintf_func) (info->stream, "fwait"); (*info->fprintf_func) (info->stream, "fwait");
return (1); return 1;
} }
if (prefixes & PREFIX_DATA) if (prefixes & PREFIX_DATA)
dflag ^= 1; sizeflag ^= DFLAG;
if (prefixes & PREFIX_ADR) if (prefixes & PREFIX_ADDR)
{ {
aflag ^= 1; sizeflag ^= AFLAG;
if (aflag) if (sizeflag & AFLAG)
oappend ("addr32 "); oappend ("addr32 ");
else else
oappend ("addr16 "); oappend ("addr16 ");
@ -1260,29 +1272,29 @@ print_insn_x86 (pc, info, aflag, dflag)
if (dp->name == NULL && dp->bytemode1 == FLOATCODE) if (dp->name == NULL && dp->bytemode1 == FLOATCODE)
{ {
dofloat (aflag, dflag); dofloat (sizeflag);
} }
else else
{ {
if (dp->name == NULL) if (dp->name == NULL)
dp = &grps[dp->bytemode1][reg]; dp = &grps[dp->bytemode1][reg];
putop (dp->name, aflag, dflag); putop (dp->name, sizeflag);
obufp = op1out; obufp = op1out;
op_ad = 2; op_ad = 2;
if (dp->op1) if (dp->op1)
(*dp->op1)(dp->bytemode1, aflag, dflag); (*dp->op1)(dp->bytemode1, sizeflag);
obufp = op2out; obufp = op2out;
op_ad = 1; op_ad = 1;
if (dp->op2) if (dp->op2)
(*dp->op2)(dp->bytemode2, aflag, dflag); (*dp->op2)(dp->bytemode2, sizeflag);
obufp = op3out; obufp = op3out;
op_ad = 0; op_ad = 0;
if (dp->op3) if (dp->op3)
(*dp->op3)(dp->bytemode3, aflag, dflag); (*dp->op3)(dp->bytemode3, sizeflag);
} }
obufp = obuf + strlen (obuf); obufp = obuf + strlen (obuf);
@ -1338,7 +1350,7 @@ print_insn_x86 (pc, info, aflag, dflag)
else else
(*info->fprintf_func) (info->stream, "%s", third); (*info->fprintf_func) (info->stream, "%s", third);
} }
return (codep - inbuf); return codep - inbuf;
} }
static char *float_mem[] = { static char *float_mem[] = {
@ -1480,10 +1492,17 @@ static struct dis386 float_reg[][8] = {
{ "fmul", STi, ST }, { "fmul", STi, ST },
{ "(bad)" }, { "(bad)" },
{ "(bad)" }, { "(bad)" },
#if UNIXWARE_COMPAT
{ "fsub", STi, ST }, { "fsub", STi, ST },
{ "fsubr", STi, ST }, { "fsubr", STi, ST },
{ "fdiv", STi, ST }, { "fdiv", STi, ST },
{ "fdivr", STi, ST }, { "fdivr", STi, ST },
#else
{ "fsubr", STi, ST },
{ "fsub", STi, ST },
{ "fdivr", STi, ST },
{ "fdiv", STi, ST },
#endif
}, },
/* dd */ /* dd */
{ {
@ -1502,10 +1521,17 @@ static struct dis386 float_reg[][8] = {
{ "fmulp", STi, ST }, { "fmulp", STi, ST },
{ "(bad)" }, { "(bad)" },
{ FGRPde_3 }, { FGRPde_3 },
#if UNIXWARE_COMPAT
{ "fsubp", STi, ST }, { "fsubp", STi, ST },
{ "fsubrp", STi, ST }, { "fsubrp", STi, ST },
{ "fdivp", STi, ST }, { "fdivp", STi, ST },
{ "fdivrp", STi, ST }, { "fdivrp", STi, ST },
#else
{ "fsubrp", STi, ST },
{ "fsubp", STi, ST },
{ "fdivrp", STi, ST },
{ "fdivp", STi, ST },
#endif
}, },
/* df */ /* df */
{ {
@ -1570,9 +1596,8 @@ static char *fgrps[][8] = {
}; };
static void static void
dofloat (aflag, dflag) dofloat (sizeflag)
int aflag; int sizeflag;
int dflag;
{ {
struct dis386 *dp; struct dis386 *dp;
unsigned char floatop; unsigned char floatop;
@ -1581,9 +1606,9 @@ dofloat (aflag, dflag)
if (mod != 3) if (mod != 3)
{ {
putop (float_mem[(floatop - 0xd8) * 8 + reg], aflag, dflag); putop (float_mem[(floatop - 0xd8) * 8 + reg], sizeflag);
obufp = op1out; obufp = op1out;
OP_E (v_mode, aflag, dflag); OP_E (v_mode, sizeflag);
return; return;
} }
codep++; codep++;
@ -1591,7 +1616,7 @@ dofloat (aflag, dflag)
dp = &float_reg[floatop - 0xd8][reg]; dp = &float_reg[floatop - 0xd8][reg];
if (dp->name == NULL) if (dp->name == NULL)
{ {
putop (fgrps[dp->bytemode1][rm], aflag, dflag); putop (fgrps[dp->bytemode1][rm], sizeflag);
/* instruction fnstsw is only one with strange arg */ /* instruction fnstsw is only one with strange arg */
if (floatop == 0xdf if (floatop == 0xdf
&& FETCH_DATA (the_info, codep + 1) && FETCH_DATA (the_info, codep + 1)
@ -1600,46 +1625,41 @@ dofloat (aflag, dflag)
} }
else else
{ {
putop (dp->name, aflag, dflag); putop (dp->name, sizeflag);
obufp = op1out; obufp = op1out;
if (dp->op1) if (dp->op1)
(*dp->op1)(dp->bytemode1, aflag, dflag); (*dp->op1)(dp->bytemode1, sizeflag);
obufp = op2out; obufp = op2out;
if (dp->op2) if (dp->op2)
(*dp->op2)(dp->bytemode2, aflag, dflag); (*dp->op2)(dp->bytemode2, sizeflag);
} }
} }
/* ARGSUSED */ /* ARGSUSED */
static int static void
OP_ST (ignore, aflag, dflag) OP_ST (ignore, sizeflag)
int ignore; int ignore;
int aflag; int sizeflag;
int dflag;
{ {
oappend ("%st"); oappend ("%st");
return (0);
} }
/* ARGSUSED */ /* ARGSUSED */
static int static void
OP_STi (ignore, aflag, dflag) OP_STi (ignore, sizeflag)
int ignore; int ignore;
int aflag; int sizeflag;
int dflag;
{ {
sprintf (scratchbuf, "%%st(%d)", rm); sprintf (scratchbuf, "%%st(%d)", rm);
oappend (scratchbuf); oappend (scratchbuf);
return (0);
} }
/* capital letters in template are macros */ /* capital letters in template are macros */
static void static void
putop (template, aflag, dflag) putop (template, sizeflag)
char *template; char *template;
int aflag; int sizeflag;
int dflag;
{ {
char *p; char *p;
@ -1651,7 +1671,7 @@ putop (template, aflag, dflag)
*obufp++ = *p; *obufp++ = *p;
break; break;
case 'C': /* For jcxz/jecxz */ case 'C': /* For jcxz/jecxz */
if (aflag) if (sizeflag & AFLAG)
*obufp++ = 'e'; *obufp++ = 'e';
break; break;
case 'N': case 'N':
@ -1660,14 +1680,14 @@ putop (template, aflag, dflag)
break; break;
case 'S': case 'S':
/* operand size flag */ /* operand size flag */
if (dflag) if (sizeflag & DFLAG)
*obufp++ = 'l'; *obufp++ = 'l';
else else
*obufp++ = 'w'; *obufp++ = 'w';
break; break;
case 'W': case 'W':
/* operand size flag for cwtl, cbtw */ /* operand size flag for cwtl, cbtw */
if (dflag) if (sizeflag & DFLAG)
*obufp++ = 'w'; *obufp++ = 'w';
else else
*obufp++ = 'b'; *obufp++ = 'b';
@ -1683,11 +1703,10 @@ oappend (s)
{ {
strcpy (obufp, s); strcpy (obufp, s);
obufp += strlen (s); obufp += strlen (s);
*obufp = 0;
} }
static void static void
append_prefix () append_seg ()
{ {
if (prefixes & PREFIX_CS) if (prefixes & PREFIX_CS)
oappend ("%cs:"); oappend ("%cs:");
@ -1703,21 +1722,19 @@ append_prefix ()
oappend ("%gs:"); oappend ("%gs:");
} }
static int static void
OP_indirE (bytemode, aflag, dflag) OP_indirE (bytemode, sizeflag)
int bytemode; int bytemode;
int aflag; int sizeflag;
int dflag;
{ {
oappend ("*"); oappend ("*");
return OP_E (bytemode, aflag, dflag); OP_E (bytemode, sizeflag);
} }
static int static void
OP_E (bytemode, aflag, dflag) OP_E (bytemode, sizeflag)
int bytemode; int bytemode;
int aflag; int sizeflag;
int dflag;
{ {
int disp; int disp;
@ -1735,7 +1752,7 @@ OP_E (bytemode, aflag, dflag)
oappend (names16[rm]); oappend (names16[rm]);
break; break;
case v_mode: case v_mode:
if (dflag) if (sizeflag & DFLAG)
oappend (names32[rm]); oappend (names32[rm]);
else else
oappend (names16[rm]); oappend (names16[rm]);
@ -1744,13 +1761,13 @@ OP_E (bytemode, aflag, dflag)
oappend ("<bad dis table>"); oappend ("<bad dis table>");
break; break;
} }
return 0; return;
} }
disp = 0; disp = 0;
append_prefix (); append_seg ();
if (aflag) /* 32 bit address mode */ if (sizeflag & AFLAG) /* 32 bit address mode */
{ {
int havesib; int havesib;
int havebase; int havebase;
@ -1854,14 +1871,14 @@ OP_E (bytemode, aflag, dflag)
oappend (")"); oappend (")");
} }
} }
return 0;
} }
static int #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
OP_G (bytemode, aflag, dflag)
static void
OP_G (bytemode, sizeflag)
int bytemode; int bytemode;
int aflag; int sizeflag;
int dflag;
{ {
switch (bytemode) switch (bytemode)
{ {
@ -1875,16 +1892,15 @@ OP_G (bytemode, aflag, dflag)
oappend (names32[reg]); oappend (names32[reg]);
break; break;
case v_mode: case v_mode:
if (dflag) if (sizeflag & DFLAG)
oappend (names32[reg]); oappend (names32[reg]);
else else
oappend (names16[reg]); oappend (names16[reg]);
break; break;
default: default:
oappend ("<internal disassembler error>"); oappend (INTERNAL_DISASSEMBLER_ERROR);
break; break;
} }
return (0);
} }
static int static int
@ -1897,7 +1913,7 @@ get32 ()
x |= (*codep++ & 0xff) << 8; x |= (*codep++ & 0xff) << 8;
x |= (*codep++ & 0xff) << 16; x |= (*codep++ & 0xff) << 16;
x |= (*codep++ & 0xff) << 24; x |= (*codep++ & 0xff) << 24;
return (x); return x;
} }
static int static int
@ -1908,7 +1924,7 @@ get16 ()
FETCH_DATA (the_info, codep + 2); FETCH_DATA (the_info, codep + 2);
x = *codep++ & 0xff; x = *codep++ & 0xff;
x |= (*codep++ & 0xff) << 8; x |= (*codep++ & 0xff) << 8;
return (x); return x;
} }
static void static void
@ -1919,11 +1935,10 @@ set_op (op)
op_address[op_ad] = op; op_address[op_ad] = op;
} }
static int static void
OP_REG (code, aflag, dflag) OP_REG (code, sizeflag)
int code; int code;
int aflag; int sizeflag;
int dflag;
{ {
char *s; char *s;
@ -1944,24 +1959,22 @@ OP_REG (code, aflag, dflag)
break; break;
case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
if (dflag) if (sizeflag & DFLAG)
s = names32[code - eAX_reg]; s = names32[code - eAX_reg];
else else
s = names16[code - eAX_reg]; s = names16[code - eAX_reg];
break; break;
default: default:
s = "<internal disassembler error>"; s = INTERNAL_DISASSEMBLER_ERROR;
break; break;
} }
oappend (s); oappend (s);
return (0);
} }
static int static void
OP_I (bytemode, aflag, dflag) OP_I (bytemode, sizeflag)
int bytemode; int bytemode;
int aflag; int sizeflag;
int dflag;
{ {
int op; int op;
@ -1972,7 +1985,7 @@ OP_I (bytemode, aflag, dflag)
op = *codep++ & 0xff; op = *codep++ & 0xff;
break; break;
case v_mode: case v_mode:
if (dflag) if (sizeflag & DFLAG)
op = get32 (); op = get32 ();
else else
op = get16 (); op = get16 ();
@ -1981,19 +1994,17 @@ OP_I (bytemode, aflag, dflag)
op = get16 (); op = get16 ();
break; break;
default: default:
oappend ("<internal disassembler error>"); oappend (INTERNAL_DISASSEMBLER_ERROR);
return (0); return;
} }
sprintf (scratchbuf, "$0x%x", op); sprintf (scratchbuf, "$0x%x", op);
oappend (scratchbuf); oappend (scratchbuf);
return (0);
} }
static int static void
OP_sI (bytemode, aflag, dflag) OP_sI (bytemode, sizeflag)
int bytemode; int bytemode;
int aflag; int sizeflag;
int dflag;
{ {
int op; int op;
@ -2006,7 +2017,7 @@ OP_sI (bytemode, aflag, dflag)
op -= 0x100; op -= 0x100;
break; break;
case v_mode: case v_mode:
if (dflag) if (sizeflag & DFLAG)
op = get32 (); op = get32 ();
else else
{ {
@ -2021,19 +2032,17 @@ OP_sI (bytemode, aflag, dflag)
op -= 0x10000; op -= 0x10000;
break; break;
default: default:
oappend ("<internal disassembler error>"); oappend (INTERNAL_DISASSEMBLER_ERROR);
return (0); return;
} }
sprintf (scratchbuf, "$0x%x", op); sprintf (scratchbuf, "$0x%x", op);
oappend (scratchbuf); oappend (scratchbuf);
return (0);
} }
static int static void
OP_J (bytemode, aflag, dflag) OP_J (bytemode, sizeflag)
int bytemode; int bytemode;
int aflag; int sizeflag;
int dflag;
{ {
int disp; int disp;
int mask = -1; int mask = -1;
@ -2047,7 +2056,7 @@ OP_J (bytemode, aflag, dflag)
disp -= 0x100; disp -= 0x100;
break; break;
case v_mode: case v_mode:
if (dflag) if (sizeflag & DFLAG)
disp = get32 (); disp = get32 ();
else else
{ {
@ -2061,43 +2070,39 @@ OP_J (bytemode, aflag, dflag)
} }
break; break;
default: default:
oappend ("<internal disassembler error>"); oappend (INTERNAL_DISASSEMBLER_ERROR);
return (0); return;
} }
disp = (start_pc + codep - start_codep + disp) & mask; disp = (start_pc + codep - start_codep + disp) & mask;
set_op (disp); set_op (disp);
sprintf (scratchbuf, "0x%x", disp); sprintf (scratchbuf, "0x%x", disp);
oappend (scratchbuf); oappend (scratchbuf);
return (0);
} }
/* ARGSUSED */ /* ARGSUSED */
static int static void
OP_SEG (dummy, aflag, dflag) OP_SEG (dummy, sizeflag)
int dummy; int dummy;
int aflag; int sizeflag;
int dflag;
{ {
static char *sreg[] = { static char *sreg[] = {
"%es","%cs","%ss","%ds","%fs","%gs","%?","%?", "%es","%cs","%ss","%ds","%fs","%gs","%?","%?",
}; };
oappend (sreg[reg]); oappend (sreg[reg]);
return (0);
} }
static int static void
OP_DIR (size, aflag, dflag) OP_DIR (size, sizeflag)
int size; int size;
int aflag; int sizeflag;
int dflag;
{ {
int seg, offset; int seg, offset;
switch (size) switch (size)
{ {
case lptr: case lptr:
if (aflag) if (sizeflag & DFLAG)
{ {
offset = get32 (); offset = get32 ();
seg = get16 (); seg = get16 ();
@ -2111,7 +2116,7 @@ OP_DIR (size, aflag, dflag)
oappend (scratchbuf); oappend (scratchbuf);
break; break;
case v_mode: case v_mode:
if (aflag) if (sizeflag & DFLAG)
offset = get32 (); offset = get32 ();
else else
{ {
@ -2126,52 +2131,58 @@ OP_DIR (size, aflag, dflag)
oappend (scratchbuf); oappend (scratchbuf);
break; break;
default: default:
oappend ("<internal disassembler error>"); oappend (INTERNAL_DISASSEMBLER_ERROR);
break; break;
} }
return (0);
} }
/* ARGSUSED */ /* ARGSUSED */
static int static void
OP_OFF (bytemode, aflag, dflag) OP_OFF (ignore, sizeflag)
int bytemode; int ignore;
int aflag; int sizeflag;
int dflag;
{ {
int off; int off;
append_prefix (); append_seg ();
if (aflag) if (sizeflag & AFLAG)
off = get32 (); off = get32 ();
else else
off = get16 (); off = get16 ();
sprintf (scratchbuf, "0x%x", off); sprintf (scratchbuf, "0x%x", off);
oappend (scratchbuf); oappend (scratchbuf);
return (0);
} }
/* ARGSUSED */ static void
static int ptr_reg (code, sizeflag)
OP_ESDI (dummy, aflag, dflag) int code;
int dummy; int sizeflag;
int aflag;
int dflag;
{ {
oappend ("%es:("); char *s;
oappend (aflag ? "%edi" : "%di"); oappend ("(");
if (sizeflag & AFLAG)
s = names32[code - eAX_reg];
else
s = names16[code - eAX_reg];
oappend (s);
oappend (")"); oappend (")");
return (0);
} }
/* ARGSUSED */ static void
static int OP_ESreg (code, sizeflag)
OP_DSSI (dummy, aflag, dflag) int code;
int dummy; int sizeflag;
int aflag; {
int dflag; oappend ("%es:");
ptr_reg (code, sizeflag);
}
static void
OP_DSreg (code, sizeflag)
int code;
int sizeflag;
{ {
if ((prefixes if ((prefixes
& (PREFIX_CS & (PREFIX_CS
@ -2181,73 +2192,61 @@ OP_DSSI (dummy, aflag, dflag)
| PREFIX_FS | PREFIX_FS
| PREFIX_GS)) == 0) | PREFIX_GS)) == 0)
prefixes |= PREFIX_DS; prefixes |= PREFIX_DS;
append_prefix (); append_seg();
oappend ("("); ptr_reg (code, sizeflag);
oappend (aflag ? "%esi" : "%si");
oappend (")");
return (0);
} }
#if 0 #if 0
/* Not used. */ /* Not used. */
/* ARGSUSED */ /* ARGSUSED */
static int static void
OP_ONE (dummy, aflag, dflag) OP_ONE (dummy, sizeflag)
int dummy; int dummy;
int aflag; int sizeflag;
int dflag;
{ {
oappend ("1"); oappend ("1");
return (0);
} }
#endif #endif
/* ARGSUSED */ /* ARGSUSED */
static int static void
OP_C (dummy, aflag, dflag) OP_C (dummy, sizeflag)
int dummy; int dummy;
int aflag; int sizeflag;
int dflag;
{ {
codep++; /* skip mod/rm */ codep++; /* skip mod/rm */
sprintf (scratchbuf, "%%cr%d", reg); sprintf (scratchbuf, "%%cr%d", reg);
oappend (scratchbuf); oappend (scratchbuf);
return (0);
} }
/* ARGSUSED */ /* ARGSUSED */
static int static void
OP_D (dummy, aflag, dflag) OP_D (dummy, sizeflag)
int dummy; int dummy;
int aflag; int sizeflag;
int dflag;
{ {
codep++; /* skip mod/rm */ codep++; /* skip mod/rm */
sprintf (scratchbuf, "%%db%d", reg); sprintf (scratchbuf, "%%db%d", reg);
oappend (scratchbuf); oappend (scratchbuf);
return (0);
} }
/* ARGSUSED */ /* ARGSUSED */
static int static void
OP_T (dummy, aflag, dflag) OP_T (dummy, sizeflag)
int dummy; int dummy;
int aflag; int sizeflag;
int dflag;
{ {
codep++; /* skip mod/rm */ codep++; /* skip mod/rm */
sprintf (scratchbuf, "%%tr%d", reg); sprintf (scratchbuf, "%%tr%d", reg);
oappend (scratchbuf); oappend (scratchbuf);
return (0);
} }
static int static void
OP_rm (bytemode, aflag, dflag) OP_rm (bytemode, sizeflag)
int bytemode; int bytemode;
int aflag; int sizeflag;
int dflag;
{ {
switch (bytemode) switch (bytemode)
{ {
@ -2258,43 +2257,39 @@ OP_rm (bytemode, aflag, dflag)
oappend (names16[rm]); oappend (names16[rm]);
break; break;
} }
return (0);
} }
static int static void
OP_MMX (bytemode, aflag, dflag) OP_MMX (ignore, sizeflag)
int bytemode; int ignore;
int aflag; int sizeflag;
int dflag;
{ {
sprintf (scratchbuf, "%%mm%d", reg); sprintf (scratchbuf, "%%mm%d", reg);
oappend (scratchbuf); oappend (scratchbuf);
return 0;
} }
static int static void
OP_EM (bytemode, aflag, dflag) OP_EM (bytemode, sizeflag)
int bytemode; int bytemode;
int aflag; int sizeflag;
int dflag;
{ {
if (mod != 3) if (mod != 3)
return OP_E (bytemode, aflag, dflag); {
OP_E (bytemode, sizeflag);
return;
}
codep++; codep++;
sprintf (scratchbuf, "%%mm%d", rm); sprintf (scratchbuf, "%%mm%d", rm);
oappend (scratchbuf); oappend (scratchbuf);
return 0;
} }
static int static void
OP_MS (bytemode, aflag, dflag) OP_MS (ignore, sizeflag)
int bytemode; int ignore;
int aflag; int sizeflag;
int dflag;
{ {
++codep; ++codep;
sprintf (scratchbuf, "%%mm%d", rm); sprintf (scratchbuf, "%%mm%d", rm);
oappend (scratchbuf); oappend (scratchbuf);
return 0;
} }