mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 06:17:47 +08:00
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:
@ -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
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user