* i386-dis.c (cond_jump_flag, loop_jcxz_flag): Define.

(cond_jump_mode, loop_jcxz_mode): Define.
	(dis386_att): Add cond_jump_flag and loop_jcxz_flag as
	appropriate, and 'F' suffix to loop insns.
	(disx86_64_att): Likewise.
	(dis386_twobyte_att): Likewise.
	(print_insn_i386): Don't output addr prefix for loop, jcxz insns.
	Output data size prefix for long conditional jumps.  Output cs and
	ds branch hints.
	(putop): Handle 'F', and mark PREFIX_ADDR used for case 'E'.
	(OP_J): Don't make PREFIX_DATA used.
This commit is contained in:
Alan Modra 2001-06-06 10:24:18 +00:00
parent cb9401fc47
commit 3ffd33cf59
2 changed files with 126 additions and 65 deletions

View file

@ -1,3 +1,17 @@
2001-06-06 Alan Modra <amodra@bigpond.net.au>
* i386-dis.c (cond_jump_flag, loop_jcxz_flag): Define.
(cond_jump_mode, loop_jcxz_mode): Define.
(dis386_att): Add cond_jump_flag and loop_jcxz_flag as
appropriate, and 'F' suffix to loop insns.
(disx86_64_att): Likewise.
(dis386_twobyte_att): Likewise.
(print_insn_i386): Don't output addr prefix for loop, jcxz insns.
Output data size prefix for long conditional jumps. Output cs and
ds branch hints.
(putop): Handle 'F', and mark PREFIX_ADDR used for case 'E'.
(OP_J): Don't make PREFIX_DATA used.
2001-06-04 Alexandre Oliva <aoliva@redhat.com> 2001-06-04 Alexandre Oliva <aoliva@redhat.com>
* sh-opc.h (sh_table): Complete last element entry to avoid * sh-opc.h (sh_table): Complete last element entry to avoid

View file

@ -250,6 +250,9 @@ fetch_data (info, addr)
#define OPSUF OP_3DNowSuffix, 0 #define OPSUF OP_3DNowSuffix, 0
#define OPSIMD OP_SIMD_Suffix, 0 #define OPSIMD OP_SIMD_Suffix, 0
#define cond_jump_flag NULL, cond_jump_mode
#define loop_jcxz_flag NULL, loop_jcxz_mode
/* bits in sizeflag */ /* bits in sizeflag */
#if 0 /* leave undefined until someone adds the extra flag to objdump */ #if 0 /* leave undefined until someone adds the extra flag to objdump */
#define SUFFIX_ALWAYS 4 #define SUFFIX_ALWAYS 4
@ -312,6 +315,8 @@ static void BadOp PARAMS ((void));
#define q_mode 5 /* quad word operand */ #define q_mode 5 /* quad word operand */
#define x_mode 6 #define x_mode 6
#define m_mode 7 /* d_mode in 32bit, q_mode in 64bit mode. */ #define m_mode 7 /* d_mode in 32bit, q_mode in 64bit mode. */
#define cond_jump_mode 8
#define loop_jcxz_mode 9
#define es_reg 100 #define es_reg 100
#define cs_reg 101 #define cs_reg 101
@ -430,6 +435,7 @@ struct dis386 {
'A' => print 'b' if no register operands or suffix_always is true 'A' => print 'b' if no register operands or suffix_always is true
'B' => print 'b' if suffix_always is true 'B' => print 'b' if suffix_always is true
'E' => print 'e' if 32-bit form of jcxz 'E' => print 'e' if 32-bit form of jcxz
'F' => print 'w' or 'l' depending on address size prefix (loop insns)
'L' => print 'l' if suffix_always is true 'L' => print 'l' if suffix_always is true
'N' => print 'n' if instruction has no wait "prefix" 'N' => print 'n' if instruction has no wait "prefix"
'O' => print 'd', or 'o' 'O' => print 'd', or 'o'
@ -574,23 +580,23 @@ static const struct dis386 dis386_att[] = {
{ "outsb", indirDX, Xb, XX }, { "outsb", indirDX, Xb, XX },
{ "outsR", indirDX, Xv, XX }, { "outsR", indirDX, Xv, XX },
/* 70 */ /* 70 */
{ "jo", Jb, XX, XX }, { "jo", Jb, cond_jump_flag, XX },
{ "jno", Jb, XX, XX }, { "jno", Jb, cond_jump_flag, XX },
{ "jb", Jb, XX, XX }, { "jb", Jb, cond_jump_flag, XX },
{ "jae", Jb, XX, XX }, { "jae", Jb, cond_jump_flag, XX },
{ "je", Jb, XX, XX }, { "je", Jb, cond_jump_flag, XX },
{ "jne", Jb, XX, XX }, { "jne", Jb, cond_jump_flag, XX },
{ "jbe", Jb, XX, XX }, { "jbe", Jb, cond_jump_flag, XX },
{ "ja", Jb, XX, XX }, { "ja", Jb, cond_jump_flag, XX },
/* 78 */ /* 78 */
{ "js", Jb, XX, XX }, { "js", Jb, cond_jump_flag, XX },
{ "jns", Jb, XX, XX }, { "jns", Jb, cond_jump_flag, XX },
{ "jp", Jb, XX, XX }, { "jp", Jb, cond_jump_flag, XX },
{ "jnp", Jb, XX, XX }, { "jnp", Jb, cond_jump_flag, XX },
{ "jl", Jb, XX, XX }, { "jl", Jb, cond_jump_flag, XX },
{ "jge", Jb, XX, XX }, { "jge", Jb, cond_jump_flag, XX },
{ "jle", Jb, XX, XX }, { "jle", Jb, cond_jump_flag, XX },
{ "jg", Jb, XX, XX }, { "jg", Jb, cond_jump_flag, XX },
/* 80 */ /* 80 */
{ GRP1b }, { GRP1b },
{ GRP1S }, { GRP1S },
@ -701,10 +707,10 @@ static const struct dis386 dis386_att[] = {
{ FLOAT }, { FLOAT },
{ FLOAT }, { FLOAT },
/* e0 */ /* e0 */
{ "loopne", Jb, XX, XX }, { "loopneF", Jb, loop_jcxz_flag, XX },
{ "loope", Jb, XX, XX }, { "loopeF", Jb, loop_jcxz_flag, XX },
{ "loop", Jb, XX, XX }, { "loopF", Jb, loop_jcxz_flag, XX },
{ "jEcxz", Jb, XX, XX }, { "jEcxz", Jb, loop_jcxz_flag, XX },
{ "inB", AL, Ib, XX }, { "inB", AL, Ib, XX },
{ "inS", eAX, Ib, XX }, { "inS", eAX, Ib, XX },
{ "outB", Ib, AL, XX }, { "outB", Ib, AL, XX },
@ -1160,23 +1166,23 @@ static const struct dis386 disx86_64_att[] = {
{ "outsb", indirDX, Xb, XX }, { "outsb", indirDX, Xb, XX },
{ "outsR", indirDX, Xv, XX }, { "outsR", indirDX, Xv, XX },
/* 70 */ /* 70 */
{ "jo", Jb, XX, XX }, { "jo", Jb, cond_jump_flag, XX },
{ "jno", Jb, XX, XX }, { "jno", Jb, cond_jump_flag, XX },
{ "jb", Jb, XX, XX }, { "jb", Jb, cond_jump_flag, XX },
{ "jae", Jb, XX, XX }, { "jae", Jb, cond_jump_flag, XX },
{ "je", Jb, XX, XX }, { "je", Jb, cond_jump_flag, XX },
{ "jne", Jb, XX, XX }, { "jne", Jb, cond_jump_flag, XX },
{ "jbe", Jb, XX, XX }, { "jbe", Jb, cond_jump_flag, XX },
{ "ja", Jb, XX, XX }, { "ja", Jb, cond_jump_flag, XX },
/* 78 */ /* 78 */
{ "js", Jb, XX, XX }, { "js", Jb, cond_jump_flag, XX },
{ "jns", Jb, XX, XX }, { "jns", Jb, cond_jump_flag, XX },
{ "jp", Jb, XX, XX }, { "jp", Jb, cond_jump_flag, XX },
{ "jnp", Jb, XX, XX }, { "jnp", Jb, cond_jump_flag, XX },
{ "jl", Jb, XX, XX }, { "jl", Jb, cond_jump_flag, XX },
{ "jge", Jb, XX, XX }, { "jge", Jb, cond_jump_flag, XX },
{ "jle", Jb, XX, XX }, { "jle", Jb, cond_jump_flag, XX },
{ "jg", Jb, XX, XX }, { "jg", Jb, cond_jump_flag, XX },
/* 80 */ /* 80 */
{ GRP1b }, { GRP1b },
{ GRP1S }, { GRP1S },
@ -1287,10 +1293,10 @@ static const struct dis386 disx86_64_att[] = {
{ FLOAT }, { FLOAT },
{ FLOAT }, { FLOAT },
/* e0 */ /* e0 */
{ "loopne", Jb, XX, XX }, { "loopneF", Jb, loop_jcxz_flag, XX },
{ "loope", Jb, XX, XX }, { "loopeF", Jb, loop_jcxz_flag, XX },
{ "loop", Jb, XX, XX }, { "loopF", Jb, loop_jcxz_flag, XX },
{ "jEcxz", Jb, XX, XX }, { "jEcxz", Jb, loop_jcxz_flag, XX },
{ "inB", AL, Ib, XX }, { "inB", AL, Ib, XX },
{ "inS", eAX, Ib, XX }, { "inS", eAX, Ib, XX },
{ "outB", Ib, AL, XX }, { "outB", Ib, AL, XX },
@ -1763,23 +1769,23 @@ static const struct dis386 dis386_twobyte_att[] = {
{ PREGRP23 }, { PREGRP23 },
{ PREGRP20 }, { PREGRP20 },
/* 80 */ /* 80 */
{ "jo", Jv, XX, XX }, { "jo", Jv, cond_jump_flag, XX },
{ "jno", Jv, XX, XX }, { "jno", Jv, cond_jump_flag, XX },
{ "jb", Jv, XX, XX }, { "jb", Jv, cond_jump_flag, XX },
{ "jae", Jv, XX, XX }, { "jae", Jv, cond_jump_flag, XX },
{ "je", Jv, XX, XX }, { "je", Jv, cond_jump_flag, XX },
{ "jne", Jv, XX, XX }, { "jne", Jv, cond_jump_flag, XX },
{ "jbe", Jv, XX, XX }, { "jbe", Jv, cond_jump_flag, XX },
{ "ja", Jv, XX, XX }, { "ja", Jv, cond_jump_flag, XX },
/* 88 */ /* 88 */
{ "js", Jv, XX, XX }, { "js", Jv, cond_jump_flag, XX },
{ "jns", Jv, XX, XX }, { "jns", Jv, cond_jump_flag, XX },
{ "jp", Jv, XX, XX }, { "jp", Jv, cond_jump_flag, XX },
{ "jnp", Jv, XX, XX }, { "jnp", Jv, cond_jump_flag, XX },
{ "jl", Jv, XX, XX }, { "jl", Jv, cond_jump_flag, XX },
{ "jge", Jv, XX, XX }, { "jge", Jv, cond_jump_flag, XX },
{ "jle", Jv, XX, XX }, { "jle", Jv, cond_jump_flag, XX },
{ "jg", Jv, XX, XX }, { "jg", Jv, cond_jump_flag, XX },
/* 90 */ /* 90 */
{ "seto", Eb, XX, XX }, { "seto", Eb, XX, XX },
{ "setno", Eb, XX, XX }, { "setno", Eb, XX, XX },
@ -3126,18 +3132,45 @@ print_insn_i386 (pc, info)
used_prefixes |= PREFIX_LOCK; used_prefixes |= PREFIX_LOCK;
} }
if (!uses_SSE_prefix && (prefixes & PREFIX_DATA))
sizeflag ^= DFLAG;
if (prefixes & PREFIX_ADDR) if (prefixes & PREFIX_ADDR)
{ {
sizeflag ^= AFLAG; sizeflag ^= AFLAG;
if (dp->bytemode2 != loop_jcxz_mode)
{
if (sizeflag & AFLAG) if (sizeflag & AFLAG)
oappend ("addr32 "); oappend ("addr32 ");
else else
oappend ("addr16 "); oappend ("addr16 ");
used_prefixes |= PREFIX_ADDR; used_prefixes |= PREFIX_ADDR;
} }
}
if (!uses_SSE_prefix && (prefixes & PREFIX_DATA))
{
sizeflag ^= DFLAG;
if (dp->bytemode2 == cond_jump_mode && dp->bytemode1 == v_mode)
{
if (sizeflag & DFLAG)
oappend ("data32 ");
else
oappend ("data16 ");
used_prefixes |= PREFIX_DATA;
}
}
if (dp->bytemode2 == cond_jump_mode || dp->bytemode2 == loop_jcxz_mode)
{
if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS)
{
oappend ("cs ");
used_prefixes |= PREFIX_CS;
}
if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
{
oappend ("ds ");
used_prefixes |= PREFIX_DS;
}
}
if (need_modrm) if (need_modrm)
{ {
@ -3717,6 +3750,21 @@ putop (template, sizeflag)
case 'E': /* For jcxz/jecxz */ case 'E': /* For jcxz/jecxz */
if (sizeflag & AFLAG) if (sizeflag & AFLAG)
*obufp++ = 'e'; *obufp++ = 'e';
used_prefixes |= (prefixes & PREFIX_ADDR);
break;
case 'F':
if ((prefixes & PREFIX_ADDR)
#ifdef SUFFIX_ALWAYS
|| (sizeflag & SUFFIX_ALWAYS)
#endif
)
{
if (sizeflag & AFLAG)
*obufp++ = 'l';
else
*obufp++ = 'w';
used_prefixes |= (prefixes & PREFIX_ADDR);
}
break; break;
case 'I': case 'I':
if (intel_syntax) if (intel_syntax)
@ -4703,7 +4751,6 @@ OP_J (bytemode, sizeflag)
displacement is added! */ displacement is added! */
mask = 0xffff; mask = 0xffff;
} }
used_prefixes |= (prefixes & PREFIX_DATA);
break; break;
default: default:
oappend (INTERNAL_DISASSEMBLER_ERROR); oappend (INTERNAL_DISASSEMBLER_ERROR);