gas/
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:
parent
167c3097b2
commit
c4a530c529
10 changed files with 143 additions and 5 deletions
|
@ -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>
|
||||
|
||||
* config/tc-i386.c (intel_e11): If not followed by T_PTR, treat T_BYTE
|
||||
|
|
|
@ -2868,6 +2868,13 @@ build_modrm_byte ()
|
|||
if ((i.op[source].regs->reg_flags & RegRex) != 0)
|
||||
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
|
||||
{ /* If it's not 2 reg operands... */
|
||||
|
@ -5040,6 +5047,7 @@ parse_register (reg_string, end_op)
|
|||
|
||||
if (r != NULL
|
||||
&& ((r->reg_flags & (RegRex64 | RegRex)) | (r->reg_type & Reg64)) != 0
|
||||
&& (r->reg_type != Control || !(cpu_arch_flags & CpuSledgehammer))
|
||||
&& flag_code != CODE_64BIT)
|
||||
return (const reg_entry *) NULL;
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
* gas/i386/intelok.d: Add -r to objdump options. Adjust expectations.
|
||||
|
|
29
gas/testsuite/gas/i386/cr-err.l
Normal file
29
gas/testsuite/gas/i386/cr-err.l
Normal 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
|
35
gas/testsuite/gas/i386/cr-err.s
Normal file
35
gas/testsuite/gas/i386/cr-err.s
Normal 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
|
20
gas/testsuite/gas/i386/crx.d
Normal file
20
gas/testsuite/gas/i386/crx.d
Normal 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
|
18
gas/testsuite/gas/i386/crx.s
Normal file
18
gas/testsuite/gas/i386/crx.s
Normal 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
|
|
@ -68,8 +68,9 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
|
|||
run_dump_test "divide"
|
||||
}
|
||||
|
||||
|
||||
run_dump_test "padlock"
|
||||
run_dump_test "crx"
|
||||
run_list_test "cr-err" ""
|
||||
|
||||
# These tests require support for 8 and 16 bit relocs,
|
||||
# so we only run them for ELF and COFF targets.
|
||||
|
|
|
@ -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>
|
||||
|
||||
* cris-dis.c (format_hex): Remove ineffective warning fix.
|
||||
|
|
|
@ -1956,7 +1956,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
|
|||
int i;
|
||||
char *first, *second, *third;
|
||||
int needcomma;
|
||||
unsigned char uses_SSE_prefix;
|
||||
unsigned char uses_SSE_prefix, uses_LOCK_prefix;
|
||||
int sizeflag;
|
||||
const char *p;
|
||||
struct dis_private priv;
|
||||
|
@ -2128,12 +2128,14 @@ print_insn (bfd_vma pc, disassemble_info *info)
|
|||
dp = &dis386_twobyte[*++codep];
|
||||
need_modrm = twobyte_has_modrm[*codep];
|
||||
uses_SSE_prefix = twobyte_uses_SSE_prefix[*codep];
|
||||
uses_LOCK_prefix = (*codep & ~0x02) == 0x20;
|
||||
}
|
||||
else
|
||||
{
|
||||
dp = &dis386[*codep];
|
||||
need_modrm = onebyte_has_modrm[*codep];
|
||||
uses_SSE_prefix = 0;
|
||||
uses_LOCK_prefix = 0;
|
||||
}
|
||||
codep++;
|
||||
|
||||
|
@ -2147,7 +2149,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
|
|||
oappend ("repnz ");
|
||||
used_prefixes |= PREFIX_REPNZ;
|
||||
}
|
||||
if (prefixes & PREFIX_LOCK)
|
||||
if (!uses_LOCK_prefix && (prefixes & PREFIX_LOCK))
|
||||
{
|
||||
oappend ("lock ");
|
||||
used_prefixes |= PREFIX_LOCK;
|
||||
|
@ -3993,9 +3995,16 @@ static void
|
|||
OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
|
||||
{
|
||||
int add = 0;
|
||||
USED_REX (REX_EXTX);
|
||||
if (rex & REX_EXTX)
|
||||
{
|
||||
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);
|
||||
oappend (scratchbuf + intel_syntax);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue