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>
|
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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
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 "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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue