gas/
authorJan Beulich <jbeulich@novell.com>
Wed, 2 Mar 2005 08:01:32 +0000 (08:01 +0000)
committerJan Beulich <jbeulich@novell.com>
Wed, 2 Mar 2005 08:01:32 +0000 (08:01 +0000)
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.

gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/ChangeLog
gas/testsuite/gas/i386/cr-err.l [new file with mode: 0644]
gas/testsuite/gas/i386/cr-err.s [new file with mode: 0644]
gas/testsuite/gas/i386/crx.d [new file with mode: 0644]
gas/testsuite/gas/i386/crx.s [new file with mode: 0644]
gas/testsuite/gas/i386/i386.exp
opcodes/ChangeLog
opcodes/i386-dis.c

index a12b38985a0147874ebec35ccf376cf2798be8c0..759c9be61b1e044145a54cf378a2254afddb61f2 100644 (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>
 
        * config/tc-i386.c (intel_e11): If not followed by T_PTR, treat T_BYTE
index 37c40734b6d291ffd876060ea566ffb45790cc56..b116ee4f51c032c6f6ccddd4bb8330ce8c7709b0 100644 (file)
@@ -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;
 
index 641368d604f4e86f997a692d02694ae6a5772c1c..0f91ee78ef2f2d0400fb4ffb97b53758b6df9418 100644 (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>
 
        * gas/i386/intelok.d: Add -r to objdump options. Adjust expectations.
diff --git a/gas/testsuite/gas/i386/cr-err.l b/gas/testsuite/gas/i386/cr-err.l
new file mode 100644 (file)
index 0000000..4aa1358
--- /dev/null
@@ -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
diff --git a/gas/testsuite/gas/i386/cr-err.s b/gas/testsuite/gas/i386/cr-err.s
new file mode 100644 (file)
index 0000000..5c45c32
--- /dev/null
@@ -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
diff --git a/gas/testsuite/gas/i386/crx.d b/gas/testsuite/gas/i386/crx.d
new file mode 100644 (file)
index 0000000..11e007a
--- /dev/null
@@ -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
diff --git a/gas/testsuite/gas/i386/crx.s b/gas/testsuite/gas/i386/crx.s
new file mode 100644 (file)
index 0000000..e0a78fd
--- /dev/null
@@ -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
index 98b6ea66bbca363a938ea2ffd049c5939e0be834..1cb1af3b6b3fe71eb8758591c998806bc0c6f80a 100644 (file)
@@ -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.
index e8c62ade31a31d801c12851d3be3fa669246d65d..21bd04eed3882b533205a4b38df687755d317e65 100644 (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>
 
        * cris-dis.c (format_hex): Remove ineffective warning fix.
index 0e9ce49e2536807cc29b30a3917713a3a8fff2ac..51204ba2811450c9addc0dfdbbde5e2a5afc6446 100644 (file)
@@ -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)
-    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);
   oappend (scratchbuf + intel_syntax);
 }