* i386-dis.c (dq_mode, Edq): Define.
(dis386_twobyte): Correct movd operands. (OP_E): Handle dq_mode case.
This commit is contained in:
parent
5f6db75ada
commit
db6eb5be2c
@ -1,3 +1,9 @@
|
||||
2003-02-06 Gwenole Beauchesne <gbeauchesne@mandrakesoft.com>
|
||||
|
||||
* i386-dis.c (dq_mode, Edq): Define.
|
||||
(dis386_twobyte): Correct movd operands.
|
||||
(OP_E): Handle dq_mode case.
|
||||
|
||||
2003-01-29 Henric Jungheim <henric@attbi.com>
|
||||
|
||||
* sparc-dis.c (print_insn_sparc): When examining values added in
|
||||
|
@ -1,7 +1,6 @@
|
||||
/* Print i386 instructions for GDB, the GNU debugger.
|
||||
Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
2001
|
||||
Free Software Foundation, Inc.
|
||||
2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -176,9 +175,9 @@ fetch_data (info, addr)
|
||||
if (status != 0)
|
||||
{
|
||||
/* If we did manage to read at least one byte, then
|
||||
print_insn_i386 will do something sensible. Otherwise, print
|
||||
an error. We do that here because this is where we know
|
||||
STATUS. */
|
||||
print_insn_i386 will do something sensible. Otherwise, print
|
||||
an error. We do that here because this is where we know
|
||||
STATUS. */
|
||||
if (priv->max_fetched == priv->the_buffer)
|
||||
(*info->memory_error_func) (status, start, info);
|
||||
longjmp (priv->bailout, 1);
|
||||
@ -193,6 +192,7 @@ fetch_data (info, addr)
|
||||
#define Eb OP_E, b_mode
|
||||
#define Ev OP_E, v_mode
|
||||
#define Ed OP_E, d_mode
|
||||
#define Edq OP_E, dq_mode
|
||||
#define indirEb OP_indirE, b_mode
|
||||
#define indirEv OP_indirE, v_mode
|
||||
#define Ew OP_E, w_mode
|
||||
@ -312,6 +312,7 @@ fetch_data (info, addr)
|
||||
#define m_mode 7 /* d_mode in 32bit, q_mode in 64bit mode. */
|
||||
#define cond_jump_mode 8
|
||||
#define loop_jcxz_mode 9
|
||||
#define dq_mode 10 /* operand size depends on REX prefixes. */
|
||||
|
||||
#define es_reg 100
|
||||
#define cs_reg 101
|
||||
@ -878,7 +879,7 @@ static const struct dis386 dis386_twobyte[] = {
|
||||
{ "packssdw", MX, EM, XX },
|
||||
{ PREGRP26 },
|
||||
{ PREGRP24 },
|
||||
{ "movd", MX, Ed, XX },
|
||||
{ "movd", MX, Edq, XX },
|
||||
{ PREGRP19 },
|
||||
/* 70 */
|
||||
{ PREGRP22 },
|
||||
@ -1611,9 +1612,9 @@ static const struct dis386 prefix_user_table[][4] = {
|
||||
},
|
||||
/* PREGRP23 */
|
||||
{
|
||||
{ "movd", Ed, MX, XX },
|
||||
{ "movd", Edq, MX, XX },
|
||||
{ "movq", XM, EX, XX },
|
||||
{ "movd", Ed, XM, XX },
|
||||
{ "movd", Edq, XM, XX },
|
||||
{ "(bad)", Ed, XM, XX },
|
||||
},
|
||||
/* PREGRP24 */
|
||||
@ -1808,9 +1809,9 @@ prefix_name (pref, sizeflag)
|
||||
return (sizeflag & DFLAG) ? "data16" : "data32";
|
||||
case 0x67:
|
||||
if (mode_64bit)
|
||||
return (sizeflag & AFLAG) ? "addr32" : "addr64";
|
||||
return (sizeflag & AFLAG) ? "addr32" : "addr64";
|
||||
else
|
||||
return ((sizeflag & AFLAG) && !mode_64bit) ? "addr16" : "addr32";
|
||||
return ((sizeflag & AFLAG) && !mode_64bit) ? "addr16" : "addr32";
|
||||
case FWAIT_OPCODE:
|
||||
return "fwait";
|
||||
default:
|
||||
@ -2040,7 +2041,7 @@ print_insn (pc, info)
|
||||
const char *name;
|
||||
|
||||
/* fwait not followed by floating point instruction. Print the
|
||||
first prefix, which is probably fwait itself. */
|
||||
first prefix, which is probably fwait itself. */
|
||||
name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
|
||||
if (name == NULL)
|
||||
name = INTERNAL_DISASSEMBLER_ERROR;
|
||||
@ -2273,7 +2274,7 @@ static const char *float_mem[] = {
|
||||
"fsubr{s||s|}",
|
||||
"fdiv{s||s|}",
|
||||
"fdivr{s||s|}",
|
||||
/* d9 */
|
||||
/* d9 */
|
||||
"fld{s||s|}",
|
||||
"(bad)",
|
||||
"fst{s||s|}",
|
||||
@ -2518,11 +2519,11 @@ dofloat (sizeflag)
|
||||
putop (float_mem[(floatop - 0xd8) * 8 + reg], sizeflag);
|
||||
obufp = op1out;
|
||||
if (floatop == 0xdb)
|
||||
OP_E (x_mode, sizeflag);
|
||||
OP_E (x_mode, sizeflag);
|
||||
else if (floatop == 0xdd)
|
||||
OP_E (d_mode, sizeflag);
|
||||
OP_E (d_mode, sizeflag);
|
||||
else
|
||||
OP_E (v_mode, sizeflag);
|
||||
OP_E (v_mode, sizeflag);
|
||||
return;
|
||||
}
|
||||
/* Skip mod/rm byte. */
|
||||
@ -2617,14 +2618,14 @@ putop (template, sizeflag)
|
||||
case '}':
|
||||
break;
|
||||
case 'A':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
|
||||
*obufp++ = 'b';
|
||||
break;
|
||||
case 'B':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (sizeflag & SUFFIX_ALWAYS)
|
||||
*obufp++ = 'b';
|
||||
break;
|
||||
@ -2642,8 +2643,8 @@ putop (template, sizeflag)
|
||||
used_prefixes |= (prefixes & PREFIX_ADDR);
|
||||
break;
|
||||
case 'F':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
|
||||
{
|
||||
if (sizeflag & AFLAG)
|
||||
@ -2654,8 +2655,8 @@ putop (template, sizeflag)
|
||||
}
|
||||
break;
|
||||
case 'H':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
|
||||
|| (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
|
||||
{
|
||||
@ -2669,8 +2670,8 @@ putop (template, sizeflag)
|
||||
}
|
||||
break;
|
||||
case 'L':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (sizeflag & SUFFIX_ALWAYS)
|
||||
*obufp++ = 'l';
|
||||
break;
|
||||
@ -2688,8 +2689,8 @@ putop (template, sizeflag)
|
||||
*obufp++ = 'd';
|
||||
break;
|
||||
case 'T':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (mode_64bit)
|
||||
{
|
||||
*obufp++ = 'q';
|
||||
@ -2697,8 +2698,8 @@ putop (template, sizeflag)
|
||||
}
|
||||
/* Fall through. */
|
||||
case 'P':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if ((prefixes & PREFIX_DATA)
|
||||
|| (rex & REX_MODE64)
|
||||
|| (sizeflag & SUFFIX_ALWAYS))
|
||||
@ -2717,8 +2718,8 @@ putop (template, sizeflag)
|
||||
}
|
||||
break;
|
||||
case 'U':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (mode_64bit)
|
||||
{
|
||||
*obufp++ = 'q';
|
||||
@ -2726,8 +2727,8 @@ putop (template, sizeflag)
|
||||
}
|
||||
/* Fall through. */
|
||||
case 'Q':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
USED_REX (REX_MODE64);
|
||||
if (mod != 3 || (sizeflag & SUFFIX_ALWAYS))
|
||||
{
|
||||
@ -2745,7 +2746,7 @@ putop (template, sizeflag)
|
||||
break;
|
||||
case 'R':
|
||||
USED_REX (REX_MODE64);
|
||||
if (intel_syntax)
|
||||
if (intel_syntax)
|
||||
{
|
||||
if (rex & REX_MODE64)
|
||||
{
|
||||
@ -2776,8 +2777,8 @@ putop (template, sizeflag)
|
||||
used_prefixes |= (prefixes & PREFIX_DATA);
|
||||
break;
|
||||
case 'S':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (sizeflag & SUFFIX_ALWAYS)
|
||||
{
|
||||
if (rex & REX_MODE64)
|
||||
@ -2797,11 +2798,11 @@ putop (template, sizeflag)
|
||||
*obufp++ = 'd';
|
||||
else
|
||||
*obufp++ = 's';
|
||||
used_prefixes |= (prefixes & PREFIX_DATA);
|
||||
used_prefixes |= (prefixes & PREFIX_DATA);
|
||||
break;
|
||||
case 'Y':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (rex & REX_MODE64)
|
||||
{
|
||||
USED_REX (REX_MODE64);
|
||||
@ -2818,7 +2819,7 @@ putop (template, sizeflag)
|
||||
*obufp++ = 'w';
|
||||
else
|
||||
*obufp++ = 'b';
|
||||
if (intel_syntax)
|
||||
if (intel_syntax)
|
||||
{
|
||||
if (rex)
|
||||
{
|
||||
@ -3000,10 +3001,11 @@ OP_E (bytemode, sizeflag)
|
||||
oappend (names32[rm + add]);
|
||||
break;
|
||||
case v_mode:
|
||||
case dq_mode:
|
||||
USED_REX (REX_MODE64);
|
||||
if (rex & REX_MODE64)
|
||||
oappend (names64[rm + add]);
|
||||
else if (sizeflag & DFLAG)
|
||||
else if ((sizeflag & DFLAG) || bytemode == dq_mode)
|
||||
oappend (names32[rm + add]);
|
||||
else
|
||||
oappend (names16[rm + add]);
|
||||
@ -3076,52 +3078,52 @@ OP_E (bytemode, sizeflag)
|
||||
}
|
||||
|
||||
if (!intel_syntax)
|
||||
if (mod != 0 || (base & 7) == 5)
|
||||
{
|
||||
if (mod != 0 || (base & 7) == 5)
|
||||
{
|
||||
print_operand_value (scratchbuf, !riprel, disp);
|
||||
oappend (scratchbuf);
|
||||
oappend (scratchbuf);
|
||||
if (riprel)
|
||||
{
|
||||
set_op (disp, 1);
|
||||
oappend ("(%rip)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (havebase || (havesib && (index != 4 || scale != 0)))
|
||||
{
|
||||
if (intel_syntax)
|
||||
{
|
||||
switch (bytemode)
|
||||
{
|
||||
case b_mode:
|
||||
oappend ("BYTE PTR ");
|
||||
break;
|
||||
case w_mode:
|
||||
oappend ("WORD PTR ");
|
||||
break;
|
||||
case v_mode:
|
||||
oappend ("DWORD PTR ");
|
||||
break;
|
||||
case d_mode:
|
||||
oappend ("QWORD PTR ");
|
||||
break;
|
||||
case m_mode:
|
||||
if (intel_syntax)
|
||||
{
|
||||
switch (bytemode)
|
||||
{
|
||||
case b_mode:
|
||||
oappend ("BYTE PTR ");
|
||||
break;
|
||||
case w_mode:
|
||||
oappend ("WORD PTR ");
|
||||
break;
|
||||
case v_mode:
|
||||
oappend ("DWORD PTR ");
|
||||
break;
|
||||
case d_mode:
|
||||
oappend ("QWORD PTR ");
|
||||
break;
|
||||
case m_mode:
|
||||
if (mode_64bit)
|
||||
oappend ("DWORD PTR ");
|
||||
else
|
||||
oappend ("QWORD PTR ");
|
||||
break;
|
||||
case x_mode:
|
||||
oappend ("XWORD PTR ");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
case x_mode:
|
||||
oappend ("XWORD PTR ");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
*obufp++ = open_char;
|
||||
if (intel_syntax && riprel)
|
||||
oappend ("rip + ");
|
||||
*obufp = '\0';
|
||||
*obufp = '\0';
|
||||
USED_REX (REX_EXTZ);
|
||||
if (!havesib && (rex & REX_EXTZ))
|
||||
base += 8;
|
||||
@ -3132,41 +3134,41 @@ OP_E (bytemode, sizeflag)
|
||||
{
|
||||
if (index != 4)
|
||||
{
|
||||
if (intel_syntax)
|
||||
{
|
||||
if (havebase)
|
||||
{
|
||||
*obufp++ = separator_char;
|
||||
*obufp = '\0';
|
||||
}
|
||||
sprintf (scratchbuf, "%s",
|
||||
if (intel_syntax)
|
||||
{
|
||||
if (havebase)
|
||||
{
|
||||
*obufp++ = separator_char;
|
||||
*obufp = '\0';
|
||||
}
|
||||
sprintf (scratchbuf, "%s",
|
||||
mode_64bit && (sizeflag & AFLAG)
|
||||
? names64[index] : names32[index]);
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
sprintf (scratchbuf, ",%s",
|
||||
mode_64bit && (sizeflag & AFLAG)
|
||||
? names64[index] : names32[index]);
|
||||
oappend (scratchbuf);
|
||||
}
|
||||
if (!intel_syntax
|
||||
|| (intel_syntax
|
||||
&& bytemode != b_mode
|
||||
&& bytemode != w_mode
|
||||
&& bytemode != v_mode))
|
||||
{
|
||||
*obufp++ = scale_char;
|
||||
*obufp = '\0';
|
||||
sprintf (scratchbuf, "%d", 1 << scale);
|
||||
oappend (scratchbuf);
|
||||
}
|
||||
if (!intel_syntax
|
||||
|| (intel_syntax
|
||||
&& bytemode != b_mode
|
||||
&& bytemode != w_mode
|
||||
&& bytemode != v_mode))
|
||||
{
|
||||
*obufp++ = scale_char;
|
||||
*obufp = '\0';
|
||||
sprintf (scratchbuf, "%d", 1 << scale);
|
||||
oappend (scratchbuf);
|
||||
}
|
||||
}
|
||||
if (intel_syntax)
|
||||
if (mod != 0 || (base & 7) == 5)
|
||||
{
|
||||
if (intel_syntax)
|
||||
if (mod != 0 || (base & 7) == 5)
|
||||
{
|
||||
/* Don't print zero displacements. */
|
||||
if (disp != 0)
|
||||
{
|
||||
if (disp != 0)
|
||||
{
|
||||
if ((bfd_signed_vma) disp > 0)
|
||||
{
|
||||
*obufp++ = '+';
|
||||
@ -3174,17 +3176,17 @@ OP_E (bytemode, sizeflag)
|
||||
}
|
||||
|
||||
print_operand_value (scratchbuf, 0, disp);
|
||||
oappend (scratchbuf);
|
||||
}
|
||||
}
|
||||
oappend (scratchbuf);
|
||||
}
|
||||
}
|
||||
|
||||
*obufp++ = close_char;
|
||||
*obufp = '\0';
|
||||
*obufp = '\0';
|
||||
}
|
||||
else if (intel_syntax)
|
||||
{
|
||||
if (mod != 0 || (base & 7) == 5)
|
||||
{
|
||||
{
|
||||
if (mod != 0 || (base & 7) == 5)
|
||||
{
|
||||
if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
|
||||
| PREFIX_ES | PREFIX_FS | PREFIX_GS))
|
||||
;
|
||||
@ -3194,9 +3196,9 @@ OP_E (bytemode, sizeflag)
|
||||
oappend (":");
|
||||
}
|
||||
print_operand_value (scratchbuf, 1, disp);
|
||||
oappend (scratchbuf);
|
||||
}
|
||||
}
|
||||
oappend (scratchbuf);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ /* 16 bit address mode */
|
||||
@ -3224,19 +3226,19 @@ OP_E (bytemode, sizeflag)
|
||||
}
|
||||
|
||||
if (!intel_syntax)
|
||||
if (mod != 0 || (rm & 7) == 6)
|
||||
{
|
||||
if (mod != 0 || (rm & 7) == 6)
|
||||
{
|
||||
print_operand_value (scratchbuf, 0, disp);
|
||||
oappend (scratchbuf);
|
||||
}
|
||||
oappend (scratchbuf);
|
||||
}
|
||||
|
||||
if (mod != 0 || (rm & 7) != 6)
|
||||
{
|
||||
*obufp++ = open_char;
|
||||
*obufp = '\0';
|
||||
*obufp = '\0';
|
||||
oappend (index16[rm + add]);
|
||||
*obufp++ = close_char;
|
||||
*obufp = '\0';
|
||||
*obufp++ = close_char;
|
||||
*obufp = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3383,9 +3385,9 @@ OP_REG (code, sizeflag)
|
||||
{
|
||||
case indir_dx_reg:
|
||||
if (intel_syntax)
|
||||
s = "[dx]";
|
||||
s = "[dx]";
|
||||
else
|
||||
s = "(%dx)";
|
||||
s = "(%dx)";
|
||||
break;
|
||||
case ax_reg: case cx_reg: case dx_reg: case bx_reg:
|
||||
case sp_reg: case bp_reg: case si_reg: case di_reg:
|
||||
@ -3441,9 +3443,9 @@ OP_IMREG (code, sizeflag)
|
||||
{
|
||||
case indir_dx_reg:
|
||||
if (intel_syntax)
|
||||
s = "[dx]";
|
||||
s = "[dx]";
|
||||
else
|
||||
s = "(%dx)";
|
||||
s = "(%dx)";
|
||||
break;
|
||||
case ax_reg: case cx_reg: case dx_reg: case bx_reg:
|
||||
case sp_reg: case bp_reg: case si_reg: case di_reg:
|
||||
@ -3725,7 +3727,7 @@ OP_OFF (bytemode, sizeflag)
|
||||
if (intel_syntax)
|
||||
{
|
||||
if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
|
||||
| PREFIX_ES | PREFIX_FS | PREFIX_GS)))
|
||||
| PREFIX_ES | PREFIX_FS | PREFIX_GS)))
|
||||
{
|
||||
oappend (names_seg[ds_reg - es_reg]);
|
||||
oappend (":");
|
||||
@ -3755,7 +3757,7 @@ OP_OFF64 (bytemode, sizeflag)
|
||||
if (intel_syntax)
|
||||
{
|
||||
if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
|
||||
| PREFIX_ES | PREFIX_FS | PREFIX_GS)))
|
||||
| PREFIX_ES | PREFIX_FS | PREFIX_GS)))
|
||||
{
|
||||
oappend (names_seg[ds_reg - es_reg]);
|
||||
oappend (":");
|
||||
@ -3780,9 +3782,9 @@ ptr_reg (code, sizeflag)
|
||||
if (rex & REX_MODE64)
|
||||
{
|
||||
if (!(sizeflag & AFLAG))
|
||||
s = names32[code - eAX_reg];
|
||||
s = names32[code - eAX_reg];
|
||||
else
|
||||
s = names64[code - eAX_reg];
|
||||
s = names64[code - eAX_reg];
|
||||
}
|
||||
else if (sizeflag & AFLAG)
|
||||
s = names32[code - eAX_reg];
|
||||
|
Loading…
Reference in New Issue
Block a user