Branch hints for Pentium4 as insn modifiers, and some minor tweaks

to formatting.
This commit is contained in:
Alan Modra 2001-06-10 14:07:12 +00:00
parent b6a71ccaa1
commit 5dd0794dca
7 changed files with 139 additions and 85 deletions

View File

@ -1,3 +1,10 @@
2001-06-10 Alan Modra <amodra@bigpond.net.au>
* config/obj-coff.c (obj_coff_section): Formatting fix.
* config/tc-i386.c (md_assemble): Accept branch hints as ",pt" and
",pn".
2001-06-08 H.J. Lu <hjl@gnu.org>
* config/tc-mips.c (warn_nops): New variable. Set to 0 to
@ -149,9 +156,9 @@
2000-05-24 Tom Rix <trix@redhat.com>
* config/obj-coff.c : (add_lineno) xcoff allows negative line
* config/obj-coff.c (add_lineno): xcoff allows negative line
numbers
* config/tc-ppc.c (ppc_stabx) : fix generated symbol
* config/tc-ppc.c (ppc_stabx): fix generated symbol
2001-05-24 Alan Modra <amodra@one.net.au>
@ -932,7 +939,7 @@
2001-02-16 matthew green <mrg@redhat.com>
* gas/cgen.c (gas_cgen_md_apply_fix3): Support BFD_RELOC_64.
* cgen.c (gas_cgen_md_apply_fix3): Support BFD_RELOC_64.
2001-02-13 Jim Wilson <wilson@redhat.com>

View File

@ -1493,8 +1493,8 @@ obj_coff_section (ignore)
{
/* This section's attributes have already been set. Warn if the
attributes don't match. */
flagword matchflags = SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
| SEC_DATA | SEC_SHARED | SEC_NEVER_LOAD;
flagword matchflags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
| SEC_DATA | SEC_SHARED | SEC_NEVER_LOAD);
if ((flags ^ oldflags) & matchflags)
as_warn (_("Ignoring changed section attributes for %s"), name);
}

View File

@ -1269,7 +1269,8 @@ md_assemble (line)
}
if (!is_space_char (*l)
&& *l != END_OF_INSN
&& *l != PREFIX_SEPARATOR)
&& *l != PREFIX_SEPARATOR
&& *l != ',')
{
as_bad (_("invalid character %s in mnemonic"),
output_invalid (*l));
@ -1360,6 +1361,38 @@ md_assemble (line)
}
}
if (current_templates->start->opcode_modifier & (Jump | JumpByte))
{
/* Check for a branch hint. We allow ",pt" and ",pn" for
predict taken and predict not taken respectively.
I'm not sure that branch hints actually do anything on loop
and jcxz insns (JumpByte) for current Pentium4 chips. They
may work in the future and it doesn't hurt to accept them
now. */
if (l[0] == ',' && l[1] == 'p')
{
if (l[2] == 't')
{
if (! add_prefix (DS_PREFIX_OPCODE))
return;
l += 3;
}
else if (l[2] == 'n')
{
if (! add_prefix (CS_PREFIX_OPCODE))
return;
l += 3;
}
}
}
/* Any other comma loses. */
if (*l == ',')
{
as_bad (_("invalid character %s in mnemonic"),
output_invalid (*l));
return;
}
/* Check if instruction is supported on specified architecture. */
if (cpu_arch_flags != 0)
{

View File

@ -1,3 +1,16 @@
2001-06-10 Alan Modra <amodra@bigpond.net.au>
* configure.in: Sort 'ta' case statement.
* configure: Regenerate.
* i386-dis.c (dis386_att): Add 'H' to conditional branch and
loop,jcxz insns.
(disx86_64_att): Likewise.
(dis386_twobyte_att): Likewise.
(print_insn_i386): Don't print branch hints as a prefix.
(putop): 'H' macro prints branch hints.
(get64): Kill compile warnings.
2001-06-09 Alexandre Oliva <aoliva@redhat.com>
* sh-opc.h (sh_table): Don't use empty initializers.
@ -11,8 +24,8 @@
2001-06-06 Peter Jakubek <pjak@snafu.de>
* opcodes/m68k-dis.c (print_insn_m68k): Fix typo.
* opcodes/m68k-opc.c (m68k_opcodes): Correct allowed operands for
* m68k-dis.c (print_insn_m68k): Fix typo.
* m68k-opc.c (m68k_opcodes): Correct allowed operands for
mcf (ColdFire) div, rem and moveb instructions.
2001-06-06 Alan Modra <amodra@bigpond.net.au>

2
opcodes/configure vendored
View File

@ -4547,8 +4547,8 @@ if test x${all_targets} = xfalse ; then
bfd_pdp11_arch) ta="$ta pdp11-dis.lo pdp11-opc.lo" ;;
bfd_pj_arch) ta="$ta pj-dis.lo pj-opc.lo" ;;
bfd_powerpc_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
bfd_pyramid_arch) ;;
bfd_powerpc_64_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
bfd_pyramid_arch) ;;
bfd_romp_arch) ;;
bfd_rs6000_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
bfd_s390_arch) ta="$ta s390-dis.lo s390-opc.lo" ;;

View File

@ -199,8 +199,8 @@ if test x${all_targets} = xfalse ; then
bfd_pdp11_arch) ta="$ta pdp11-dis.lo pdp11-opc.lo" ;;
bfd_pj_arch) ta="$ta pj-dis.lo pj-opc.lo" ;;
bfd_powerpc_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
bfd_pyramid_arch) ;;
bfd_powerpc_64_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
bfd_pyramid_arch) ;;
bfd_romp_arch) ;;
bfd_rs6000_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
bfd_s390_arch) ta="$ta s390-dis.lo s390-opc.lo" ;;

View File

@ -436,6 +436,7 @@ struct dis386 {
'B' => print 'b' if suffix_always is true
'E' => print 'e' if 32-bit form of jcxz
'F' => print 'w' or 'l' depending on address size prefix (loop insns)
'H' => print ",pt" or ",pn" branch hint
'L' => print 'l' if suffix_always is true
'N' => print 'n' if instruction has no wait "prefix"
'O' => print 'd', or 'o'
@ -580,23 +581,23 @@ static const struct dis386 dis386_att[] = {
{ "outsb", indirDX, Xb, XX },
{ "outsR", indirDX, Xv, XX },
/* 70 */
{ "jo", Jb, cond_jump_flag, XX },
{ "jno", Jb, cond_jump_flag, XX },
{ "jb", Jb, cond_jump_flag, XX },
{ "jae", Jb, cond_jump_flag, XX },
{ "je", Jb, cond_jump_flag, XX },
{ "jne", Jb, cond_jump_flag, XX },
{ "jbe", Jb, cond_jump_flag, XX },
{ "ja", Jb, cond_jump_flag, XX },
{ "joH", Jb, cond_jump_flag, XX },
{ "jnoH", Jb, cond_jump_flag, XX },
{ "jbH", Jb, cond_jump_flag, XX },
{ "jaeH", Jb, cond_jump_flag, XX },
{ "jeH", Jb, cond_jump_flag, XX },
{ "jneH", Jb, cond_jump_flag, XX },
{ "jbeH", Jb, cond_jump_flag, XX },
{ "jaH", Jb, cond_jump_flag, XX },
/* 78 */
{ "js", Jb, cond_jump_flag, XX },
{ "jns", Jb, cond_jump_flag, XX },
{ "jp", Jb, cond_jump_flag, XX },
{ "jnp", Jb, cond_jump_flag, XX },
{ "jl", Jb, cond_jump_flag, XX },
{ "jge", Jb, cond_jump_flag, XX },
{ "jle", Jb, cond_jump_flag, XX },
{ "jg", Jb, cond_jump_flag, XX },
{ "jsH", Jb, cond_jump_flag, XX },
{ "jnsH", Jb, cond_jump_flag, XX },
{ "jpH", Jb, cond_jump_flag, XX },
{ "jnpH", Jb, cond_jump_flag, XX },
{ "jlH", Jb, cond_jump_flag, XX },
{ "jgeH", Jb, cond_jump_flag, XX },
{ "jleH", Jb, cond_jump_flag, XX },
{ "jgH", Jb, cond_jump_flag, XX },
/* 80 */
{ GRP1b },
{ GRP1S },
@ -707,10 +708,10 @@ static const struct dis386 dis386_att[] = {
{ FLOAT },
{ FLOAT },
/* e0 */
{ "loopneF", Jb, loop_jcxz_flag, XX },
{ "loopeF", Jb, loop_jcxz_flag, XX },
{ "loopF", Jb, loop_jcxz_flag, XX },
{ "jEcxz", Jb, loop_jcxz_flag, XX },
{ "loopneFH", Jb, loop_jcxz_flag, XX },
{ "loopeFH", Jb, loop_jcxz_flag, XX },
{ "loopFH", Jb, loop_jcxz_flag, XX },
{ "jEcxzH", Jb, loop_jcxz_flag, XX },
{ "inB", AL, Ib, XX },
{ "inS", eAX, Ib, XX },
{ "outB", Ib, AL, XX },
@ -1166,23 +1167,23 @@ static const struct dis386 disx86_64_att[] = {
{ "outsb", indirDX, Xb, XX },
{ "outsR", indirDX, Xv, XX },
/* 70 */
{ "jo", Jb, cond_jump_flag, XX },
{ "jno", Jb, cond_jump_flag, XX },
{ "jb", Jb, cond_jump_flag, XX },
{ "jae", Jb, cond_jump_flag, XX },
{ "je", Jb, cond_jump_flag, XX },
{ "jne", Jb, cond_jump_flag, XX },
{ "jbe", Jb, cond_jump_flag, XX },
{ "ja", Jb, cond_jump_flag, XX },
{ "joH", Jb, cond_jump_flag, XX },
{ "jnoH", Jb, cond_jump_flag, XX },
{ "jbH", Jb, cond_jump_flag, XX },
{ "jaeH", Jb, cond_jump_flag, XX },
{ "jeH", Jb, cond_jump_flag, XX },
{ "jneH", Jb, cond_jump_flag, XX },
{ "jbeH", Jb, cond_jump_flag, XX },
{ "jaH", Jb, cond_jump_flag, XX },
/* 78 */
{ "js", Jb, cond_jump_flag, XX },
{ "jns", Jb, cond_jump_flag, XX },
{ "jp", Jb, cond_jump_flag, XX },
{ "jnp", Jb, cond_jump_flag, XX },
{ "jl", Jb, cond_jump_flag, XX },
{ "jge", Jb, cond_jump_flag, XX },
{ "jle", Jb, cond_jump_flag, XX },
{ "jg", Jb, cond_jump_flag, XX },
{ "jsH", Jb, cond_jump_flag, XX },
{ "jnsH", Jb, cond_jump_flag, XX },
{ "jpH", Jb, cond_jump_flag, XX },
{ "jnpH", Jb, cond_jump_flag, XX },
{ "jlH", Jb, cond_jump_flag, XX },
{ "jgeH", Jb, cond_jump_flag, XX },
{ "jleH", Jb, cond_jump_flag, XX },
{ "jgH", Jb, cond_jump_flag, XX },
/* 80 */
{ GRP1b },
{ GRP1S },
@ -1293,10 +1294,10 @@ static const struct dis386 disx86_64_att[] = {
{ FLOAT },
{ FLOAT },
/* e0 */
{ "loopneF", Jb, loop_jcxz_flag, XX },
{ "loopeF", Jb, loop_jcxz_flag, XX },
{ "loopF", Jb, loop_jcxz_flag, XX },
{ "jEcxz", Jb, loop_jcxz_flag, XX },
{ "loopneFH", Jb, loop_jcxz_flag, XX },
{ "loopeFH", Jb, loop_jcxz_flag, XX },
{ "loopFH", Jb, loop_jcxz_flag, XX },
{ "jEcxzH", Jb, loop_jcxz_flag, XX },
{ "inB", AL, Ib, XX },
{ "inS", eAX, Ib, XX },
{ "outB", Ib, AL, XX },
@ -1769,23 +1770,23 @@ static const struct dis386 dis386_twobyte_att[] = {
{ PREGRP23 },
{ PREGRP20 },
/* 80 */
{ "jo", Jv, cond_jump_flag, XX },
{ "jno", Jv, cond_jump_flag, XX },
{ "jb", Jv, cond_jump_flag, XX },
{ "jae", Jv, cond_jump_flag, XX },
{ "je", Jv, cond_jump_flag, XX },
{ "jne", Jv, cond_jump_flag, XX },
{ "jbe", Jv, cond_jump_flag, XX },
{ "ja", Jv, cond_jump_flag, XX },
{ "joH", Jv, cond_jump_flag, XX },
{ "jnoH", Jv, cond_jump_flag, XX },
{ "jbH", Jv, cond_jump_flag, XX },
{ "jaeH", Jv, cond_jump_flag, XX },
{ "jeH", Jv, cond_jump_flag, XX },
{ "jneH", Jv, cond_jump_flag, XX },
{ "jbeH", Jv, cond_jump_flag, XX },
{ "jaH", Jv, cond_jump_flag, XX },
/* 88 */
{ "js", Jv, cond_jump_flag, XX },
{ "jns", Jv, cond_jump_flag, XX },
{ "jp", Jv, cond_jump_flag, XX },
{ "jnp", Jv, cond_jump_flag, XX },
{ "jl", Jv, cond_jump_flag, XX },
{ "jge", Jv, cond_jump_flag, XX },
{ "jle", Jv, cond_jump_flag, XX },
{ "jg", Jv, cond_jump_flag, XX },
{ "jsH", Jv, cond_jump_flag, XX },
{ "jnsH", Jv, cond_jump_flag, XX },
{ "jpH", Jv, cond_jump_flag, XX },
{ "jnpH", Jv, cond_jump_flag, XX },
{ "jlH", Jv, cond_jump_flag, XX },
{ "jgeH", Jv, cond_jump_flag, XX },
{ "jleH", Jv, cond_jump_flag, XX },
{ "jgH", Jv, cond_jump_flag, XX },
/* 90 */
{ "seto", Eb, XX, XX },
{ "setno", Eb, XX, XX },
@ -3158,20 +3159,6 @@ print_insn_i386 (pc, info)
}
}
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)
{
FETCH_DATA (info, codep + 1);
@ -3766,6 +3753,19 @@ putop (template, sizeflag)
used_prefixes |= (prefixes & PREFIX_ADDR);
}
break;
case 'H':
if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
|| (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
{
used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
*obufp++ = ',';
*obufp++ = 'p';
if (prefixes & PREFIX_DS)
*obufp++ = 't';
else
*obufp++ = 'n';
}
break;
case 'I':
if (intel_syntax)
break;
@ -4405,23 +4405,24 @@ OP_G (bytemode, sizeflag)
static bfd_vma
get64 ()
{
unsigned int a = 0;
unsigned int b = 0;
bfd_vma x = 0;
bfd_vma x;
#ifdef BFD64
unsigned int a;
unsigned int b;
FETCH_DATA (the_info, codep + 8);
a = *codep++ & 0xff;
a |= (*codep++ & 0xff) << 8;
a |= (*codep++ & 0xff) << 16;
a |= (*codep++ & 0xff) << 24;
b |= (*codep++ & 0xff);
b = *codep++ & 0xff;
b |= (*codep++ & 0xff) << 8;
b |= (*codep++ & 0xff) << 16;
b |= (*codep++ & 0xff) << 24;
x = a + ((bfd_vma) b << 32);
#else
abort();
x = 0;
#endif
return x;
}