gas/
authorJan Beulich <jbeulich@novell.com>
Thu, 27 Jan 2005 08:41:25 +0000 (08:41 +0000)
committerJan Beulich <jbeulich@novell.com>
Thu, 27 Jan 2005 08:41:25 +0000 (08:41 +0000)
2005-01-25  Jan Beulich  <jbeulich@novell.com>

* config/tc-ia64.c (emit_one_bundle): Add late resolution of move
to/from application registers dynamic insns.
(md_assemble): Defer resolution of move to/from application registers
dynamic insns when they can be issued on either the I- or M-units.

gas/testsuite/
2005-01-25  Jan Beulich  <jbeulich@novell.com>

* gas/ia64/dv-waw-err.l: Don't expect ar112 move warning to refer to
M-unit.
* gas/ia64/mov-ar.[ds]: New.
* gas/ia64/ia64.exp: Run new test.

gas/ChangeLog
gas/config/tc-ia64.c
gas/testsuite/ChangeLog
gas/testsuite/gas/ia64/dv-waw-err.l
gas/testsuite/gas/ia64/ia64.exp
gas/testsuite/gas/ia64/mov-ar.d [new file with mode: 0644]
gas/testsuite/gas/ia64/mov-ar.s [new file with mode: 0644]

index 5cc7c42..5fe349f 100644 (file)
@@ -1,3 +1,10 @@
+2005-01-25  Jan Beulich  <jbeulich@novell.com>
+
+       * config/tc-ia64.c (emit_one_bundle): Add late resolution of move
+       to/from application registers dynamic insns.
+       (md_assemble): Defer resolution of move to/from application registers
+       dynamic insns when they can be issued on either the I- or M-units.
+
 2005-01-25  Alexandre Oliva  <aoliva@redhat.com>
 
        * config/tc-frv.c (md_apply_fix3): Mark TLS symbols as such.
index 75a8434..d065449 100644 (file)
@@ -6370,25 +6370,42 @@ emit_one_bundle ()
       /* resolve dynamic opcodes such as "break", "hint", and "nop":  */
       if (idesc->type == IA64_TYPE_DYN)
        {
+         enum ia64_opnd opnd1, opnd2;
+
          if ((strcmp (idesc->name, "nop") == 0)
              || (strcmp (idesc->name, "hint") == 0)
              || (strcmp (idesc->name, "break") == 0))
            insn_unit = required_unit;
-         else if (strcmp (idesc->name, "chk.s") == 0)
+         else if (strcmp (idesc->name, "chk.s") == 0
+             || strcmp (idesc->name, "mov") == 0)
            {
              insn_unit = IA64_UNIT_M;
-             if (required_unit == IA64_UNIT_I)
+             if (required_unit == IA64_UNIT_I
+                 || (required_unit == IA64_UNIT_F && template == 6))
                insn_unit = IA64_UNIT_I;
            }
          else
            as_fatal ("emit_one_bundle: unexpected dynamic op");
 
          sprintf (mnemonic, "%s.%c", idesc->name, "?imbf??"[insn_unit]);
+         opnd1 = idesc->operands[0];
+         opnd2 = idesc->operands[1];
          ia64_free_opcode (idesc);
-         md.slot[curr].idesc = idesc = ia64_find_opcode (mnemonic);
+         idesc = ia64_find_opcode (mnemonic);
+         /* moves to/from ARs have collisions */
+         if (opnd1 == IA64_OPND_AR3 || opnd2 == IA64_OPND_AR3)
+           {
+             while (idesc != NULL
+                    && (idesc->operands[0] != opnd1
+                        || idesc->operands[1] != opnd2))
+               idesc = get_next_opcode (idesc);
+           }
 #if 0
-         know (!idesc->next);  /* no resolved dynamic ops have collisions */
+         else
+           /* no other resolved dynamic ops have collisions */
+           know (!get_next_opcode (idesc));
 #endif
+         md.slot[curr].idesc = idesc;
        }
       else
        {
@@ -10071,17 +10088,22 @@ md_assemble (str)
            {
              if (ar_is_only_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
                mnemonic = "mov.i";
-             else
+             else if (ar_is_only_in_memory_unit (CURR_SLOT.opnd[rop].X_add_number))
                mnemonic = "mov.m";
+             else
+               rop = -1;
            }
          else
            abort ();
-         ia64_free_opcode (idesc);
-         idesc = ia64_find_opcode (mnemonic);
-         while (idesc != NULL
-                && (idesc->operands[0] != opnd1
-                    || idesc->operands[1] != opnd2))
-           idesc = get_next_opcode (idesc);
+         if (rop >= 0)
+           {
+             ia64_free_opcode (idesc);
+             idesc = ia64_find_opcode (mnemonic);
+             while (idesc != NULL
+                    && (idesc->operands[0] != opnd1
+                        || idesc->operands[1] != opnd2))
+               idesc = get_next_opcode (idesc);
+           }
        }
     }
   else if (strcmp (idesc->name, "mov.i") == 0
index eaf1df9..71a6567 100644 (file)
@@ -1,3 +1,10 @@
+2005-01-25  Jan Beulich  <jbeulich@novell.com>
+
+       * gas/ia64/dv-waw-err.l: Don't expect ar112 move warning to refer to
+       M-unit.
+       * gas/ia64/mov-ar.[ds]: New.
+       * gas/ia64/ia64.exp: Run new test.
+
 2005-01-24  Nick Clifton  <nickc@redhat.com>
 
        * gas/all/sleb128.d: Do not assume an 8-bit byte.
index 6c9225b..c641cb3 100644 (file)
@@ -81,7 +81,7 @@
 .*:108: Warning: This is the location of the conflicting usage
 .*:114: Warning: Use of 'st8\.spill' .* WAW dependency 'AR\[UNAT\]{%}, % in 0 - 63' \(impliedf\)
 .*:113: Warning: This is the location of the conflicting usage
-.*:119: Warning: Use of 'mov\.m' .* WAW dependency 'AR%, % in 48 - 63, 112-127' \(impliedf\), specific resource number is 48
+.*:119: Warning: Use of 'mov(\.[im])?' .* WAW dependency 'AR%, % in 48 - 63, 112-127' \(impliedf\), specific resource number is 48
 .*:118: Warning: This is the location of the conflicting usage
 .*:124: Warning: Use of 'mov' .* WAW dependency 'BR%, % in 0 - 7' \(impliedf\), specific resource number is 1
 .*:123: Warning: This is the location of the conflicting usage
index 48c4b50..89d3965 100644 (file)
@@ -24,6 +24,7 @@ if [istarget "ia64-*"] then {
     run_dump_test "opc-i"
     run_dump_test "opc-m"
     run_dump_test "opc-x"
+    run_dump_test "mov-ar"
 
     run_list_test "dv-raw-err" ""
     run_list_test "dv-waw-err" ""
diff --git a/gas/testsuite/gas/ia64/mov-ar.d b/gas/testsuite/gas/ia64/mov-ar.d
new file mode 100644 (file)
index 0000000..ec7cb61
--- /dev/null
@@ -0,0 +1,26 @@
+# objdump: -d
+# name: ia64 app reg moves
+
+.*: +file format .*
+
+Disassembly of section \.text:
+
+0+0 <_start>:
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m ar.k0=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar127=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m ar47=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar112=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m ar48=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar111=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m ar63=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar.pfs=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m ar112=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar63=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m ar127=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar48=r0;;
diff --git a/gas/testsuite/gas/ia64/mov-ar.s b/gas/testsuite/gas/ia64/mov-ar.s
new file mode 100644 (file)
index 0000000..79780d9
--- /dev/null
@@ -0,0 +1,21 @@
+.explicit
+_start:
+{.mfi
+       mov     ar0 = r0
+       mov     ar127 = r0
+} ;; {.mfi
+       mov     ar47 = r0
+       mov     ar112 = r0
+} ;; {.mfi
+       mov     ar48 = r0
+       mov     ar111 = r0
+} ;; {.mfi
+       mov     ar63 = r0
+       mov     ar64 = r0
+} ;; {.mfi
+       mov     ar112 = r0
+       mov     ar63 = r0
+} ;; {.mfi
+       mov     ar127 = r0
+       mov     ar48 = r0
+} ;;