2005-03-02  Jan Beulich  <jbeulich@novell.com>

	* config/tc-i386.c (build_modrm_byte): Add lock prefix for cr8...15
	accesses.
	(parse_register): Allow cr8...15 in all modes.

gas/testsuite/
2005-03-02  Jan Beulich  <jbeulich@novell.com>

	* gas/i386/cr-err.[ls]: New.
	* gas/i386/crx.[ds]: New.
	* gas/i386/i386.exp: Run new tests.

opcodes/
2005-03-02  Jan Beulich  <jbeulich@novell.com>

	* i386-dis.c (print_insn): Suppress lock prefix printing for cr8...15
	accesses.
	(OP_C): Consider lock prefix in non-64-bit modes.
This commit is contained in:
Jan Beulich 2005-03-02 08:01:32 +00:00
parent 167c3097b2
commit c4a530c529
10 changed files with 143 additions and 5 deletions

View file

@ -1,3 +1,9 @@
2005-03-02 Jan Beulich <jbeulich@novell.com>
* config/tc-i386.c (build_modrm_byte): Add lock prefix for cr8...15
accesses.
(parse_register): Allow cr8...15 in all modes.
2005-03-02 Jan Beulich <jbeulich@novell.com> 2005-03-02 Jan Beulich <jbeulich@novell.com>
* config/tc-i386.c (intel_e11): If not followed by T_PTR, treat T_BYTE * config/tc-i386.c (intel_e11): If not followed by T_PTR, treat T_BYTE

View file

@ -2868,6 +2868,13 @@ build_modrm_byte ()
if ((i.op[source].regs->reg_flags & RegRex) != 0) if ((i.op[source].regs->reg_flags & RegRex) != 0)
i.rex |= REX_EXTX; i.rex |= REX_EXTX;
} }
if (flag_code != CODE_64BIT && (i.rex & (REX_EXTX | REX_EXTZ)))
{
if (!((i.types[0] | i.types[1]) & Control))
abort ();
i.rex &= ~(REX_EXTX | REX_EXTZ);
add_prefix (LOCK_PREFIX_OPCODE);
}
} }
else else
{ /* If it's not 2 reg operands... */ { /* If it's not 2 reg operands... */
@ -5040,6 +5047,7 @@ parse_register (reg_string, end_op)
if (r != NULL if (r != NULL
&& ((r->reg_flags & (RegRex64 | RegRex)) | (r->reg_type & Reg64)) != 0 && ((r->reg_flags & (RegRex64 | RegRex)) | (r->reg_type & Reg64)) != 0
&& (r->reg_type != Control || !(cpu_arch_flags & CpuSledgehammer))
&& flag_code != CODE_64BIT) && flag_code != CODE_64BIT)
return (const reg_entry *) NULL; return (const reg_entry *) NULL;

View file

@ -1,3 +1,9 @@
2005-03-02 Jan Beulich <jbeulich@novell.com>
* gas/i386/cr-err.[ls]: New.
* gas/i386/crx.[ds]: New.
* gas/i386/i386.exp: Run new tests.
2005-03-02 Jan Beulich <jbeulich@novell.com> 2005-03-02 Jan Beulich <jbeulich@novell.com>
* gas/i386/intelok.d: Add -r to objdump options. Adjust expectations. * gas/i386/intelok.d: Add -r to objdump options. Adjust expectations.

View file

@ -0,0 +1,29 @@
.*: Assembler messages:
.*:[0-9]+: Error: .\(%cr0\). is not a valid base/index expression
.*:[0-9]+: Error: .\(%cr7\). is not a valid base/index expression
.*:[0-9]+: Error: .\(%cr8\). is not a valid base/index expression
.*:[0-9]+: Error: .\(%cr15\). is not a valid base/index expression
.*:[0-9]+: Error: .\(%db0\). is not a valid base/index expression
.*:[0-9]+: Error: .\(%db7\). is not a valid base/index expression
.*:[0-9]+: Error: .\(%dr0\). is not a valid base/index expression
.*:[0-9]+: Error: .\(%dr7\). is not a valid base/index expression
.*:[0-9]+: Error: .\(%tr0\). is not a valid base/index expression
.*:[0-9]+: Error: .\(%tr7\). is not a valid base/index expression
.*:[0-9]+: Error: .\(cr0\). is not a valid base/index expression
.*:[0-9]+: Error: .\(cr7\). is not a valid base/index expression
.*:[0-9]+: Error: .\(cr8\). is not a valid base/index expression
.*:[0-9]+: Error: .\(cr15\). is not a valid base/index expression
.*:[0-9]+: Error: .\(db0\). is not a valid base/index expression
.*:[0-9]+: Error: .\(db7\). is not a valid base/index expression
.*:[0-9]+: Error: .\(dr0\). is not a valid base/index expression
.*:[0-9]+: Error: .\(dr7\). is not a valid base/index expression
.*:[0-9]+: Error: .\(tr0\). is not a valid base/index expression
.*:[0-9]+: Error: .\(tr7\). is not a valid base/index expression
.*:[0-9]+: Error: .\[cr0\]. is not a valid base/index expression
.*:[0-9]+: Error: .\[cr7\]. is not a valid base/index expression
.*:[0-9]+: Error: .\[cr8\]. is not a valid base/index expression
.*:[0-9]+: Error: .\[cr15\]. is not a valid base/index expression
.*:[0-9]+: Error: .\[dr0\]. is not a valid base/index expression
.*:[0-9]+: Error: .\[dr7\]. is not a valid base/index expression
.*:[0-9]+: Error: .\[tr0\]. is not a valid base/index expression
.*:[0-9]+: Error: .\[tr7\]. is not a valid base/index expression

View file

@ -0,0 +1,35 @@
.text
_start:
movl (%cr0), %eax
movl %eax, (%cr7)
movl (%cr8), %eax
movl %eax, (%cr15)
movl (%db0), %eax
movl %eax, (%db7)
movl (%dr0), %eax
movl %eax, (%dr7)
movl (%tr0), %eax
movl %eax, (%tr7)
.att_syntax noprefix
movl (cr0), eax
movl eax, (cr7)
movl (cr8), eax
movl eax, (cr15)
movl (db0), eax
movl eax, (db7)
movl (dr0), eax
movl eax, (dr7)
movl (tr0), eax
movl eax, (tr7)
.intel_syntax noprefix
mov eax, [cr0]
mov [cr7], eax
mov eax, [cr8]
mov [cr15], eax
mov eax, [dr0]
mov [dr7], eax
mov eax, [tr0]
mov [tr7], eax

View file

@ -0,0 +1,20 @@
#objdump: -dw
#name: i386 cr8+
.*: +file format .*
Disassembly of section .text:
0+ <_start>:
[ ]*[0-9a-f]+: f0 0f 20 c0[ ]+movl?[ ]+?%cr8,%eax
[ ]*[0-9a-f]+: f0 0f 20 c7[ ]+movl?[ ]+?%cr8,%edi
[ ]*[0-9a-f]+: f0 0f 22 c0[ ]+movl?[ ]+?%eax,%cr8
[ ]*[0-9a-f]+: f0 0f 22 c7[ ]+movl?[ ]+?%edi,%cr8
[ ]*[0-9a-f]+: f0 0f 20 c0[ ]+movl?[ ]+?%cr8,%eax
[ ]*[0-9a-f]+: f0 0f 20 c7[ ]+movl?[ ]+?%cr8,%edi
[ ]*[0-9a-f]+: f0 0f 22 c0[ ]+movl?[ ]+?%eax,%cr8
[ ]*[0-9a-f]+: f0 0f 22 c7[ ]+movl?[ ]+?%edi,%cr8
[ ]*[0-9a-f]+: f0 0f 20 c0[ ]+movl?[ ]+?%cr8,%eax
[ ]*[0-9a-f]+: f0 0f 20 c7[ ]+movl?[ ]+?%cr8,%edi
[ ]*[0-9a-f]+: f0 0f 22 c0[ ]+movl?[ ]+?%eax,%cr8
[ ]*[0-9a-f]+: f0 0f 22 c7[ ]+movl?[ ]+?%edi,%cr8

View file

@ -0,0 +1,18 @@
.text
_start:
movl %cr8, %eax
movl %cr8, %edi
movl %eax, %cr8
movl %edi, %cr8
.att_syntax noprefix
movl cr8, eax
movl cr8, edi
movl eax, cr8
movl edi, cr8
.intel_syntax noprefix
mov eax, cr8
mov edi, cr8
mov cr8, eax
mov cr8, edi

View file

@ -68,8 +68,9 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
run_dump_test "divide" run_dump_test "divide"
} }
run_dump_test "padlock" run_dump_test "padlock"
run_dump_test "crx"
run_list_test "cr-err" ""
# These tests require support for 8 and 16 bit relocs, # These tests require support for 8 and 16 bit relocs,
# so we only run them for ELF and COFF targets. # so we only run them for ELF and COFF targets.

View file

@ -1,3 +1,9 @@
2005-03-02 Jan Beulich <jbeulich@novell.com>
* i386-dis.c (print_insn): Suppress lock prefix printing for cr8...15
accesses.
(OP_C): Consider lock prefix in non-64-bit modes.
2005-02-24 Alan Modra <amodra@bigpond.net.au> 2005-02-24 Alan Modra <amodra@bigpond.net.au>
* cris-dis.c (format_hex): Remove ineffective warning fix. * cris-dis.c (format_hex): Remove ineffective warning fix.

View file

@ -1956,7 +1956,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
int i; int i;
char *first, *second, *third; char *first, *second, *third;
int needcomma; int needcomma;
unsigned char uses_SSE_prefix; unsigned char uses_SSE_prefix, uses_LOCK_prefix;
int sizeflag; int sizeflag;
const char *p; const char *p;
struct dis_private priv; struct dis_private priv;
@ -2128,12 +2128,14 @@ print_insn (bfd_vma pc, disassemble_info *info)
dp = &dis386_twobyte[*++codep]; dp = &dis386_twobyte[*++codep];
need_modrm = twobyte_has_modrm[*codep]; need_modrm = twobyte_has_modrm[*codep];
uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep]; uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep];
uses_LOCK_prefix = (*codep & ~0x02) == 0x20;
} }
else else
{ {
dp = &dis386[*codep]; dp = &dis386[*codep];
need_modrm = onebyte_has_modrm[*codep]; need_modrm = onebyte_has_modrm[*codep];
uses_SSE_prefix = 0; uses_SSE_prefix = 0;
uses_LOCK_prefix = 0;
} }
codep++; codep++;
@ -2147,7 +2149,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
oappend ("repnz "); oappend ("repnz ");
used_prefixes |= PREFIX_REPNZ; used_prefixes |= PREFIX_REPNZ;
} }
if (prefixes & PREFIX_LOCK) if (!uses_LOCK_prefix && (prefixes & PREFIX_LOCK))
{ {
oappend ("lock "); oappend ("lock ");
used_prefixes |= PREFIX_LOCK; used_prefixes |= PREFIX_LOCK;
@ -3993,9 +3995,16 @@ static void
OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
{ {
int add = 0; int add = 0;
USED_REX (REX_EXTX);
if (rex & REX_EXTX) if (rex & REX_EXTX)
add = 8; {
USED_REX (REX_EXTX);
add = 8;
}
else if (!mode_64bit && (prefixes & PREFIX_LOCK))
{
used_prefixes |= PREFIX_LOCK;
add = 8;
}
sprintf (scratchbuf, "%%cr%d", reg + add); sprintf (scratchbuf, "%%cr%d", reg + add);
oappend (scratchbuf + intel_syntax); oappend (scratchbuf + intel_syntax);
} }