gas/
authorJan Beulich <jbeulich@novell.com>
Tue, 15 Feb 2005 07:54:03 +0000 (07:54 +0000)
committerJan Beulich <jbeulich@novell.com>
Tue, 15 Feb 2005 07:54:03 +0000 (07:54 +0000)
2005-02-15  Jan Beulich  <jbeulich@novell.com>

* config/tc-ia64.c: Include limits.h (if available).
(gr_values[0]): Set path to INT_MAX.
(dot_reg_val): Don't allow changing value of r0. Limit range of
general registers at r127.
(specify_resource): Default resource index is -1. Don't set resource
index (in case IA64_RS_RSE) without setting the specific flag.
(note_register_values): Check operand is O_constant before tracking
input value of moves. Add tracking for dep.z with constant inputs.
(print_dependency): Resource index of specific resource may be zero.
(check_dependencies): Likewise.

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

* gas/ia64/dv-raw-err.l: Expect specific resource for RAW violation on b0.
* gas/ia64/regval.[ls]: New.
* gas/ia64/ia64.exp: Run new test.

gas/ChangeLog
gas/config/tc-ia64.c
gas/testsuite/ChangeLog
gas/testsuite/gas/ia64/dv-raw-err.l
gas/testsuite/gas/ia64/ia64.exp
gas/testsuite/gas/ia64/regval.l [new file with mode: 0644]
gas/testsuite/gas/ia64/regval.s [new file with mode: 0644]

index a75b7e8796ba21fedad0c2c0d1287a14e7c104ab..d8f54c6c84e9eea446a00288eb62dbb149ba3650 100644 (file)
@@ -1,3 +1,16 @@
+2005-02-15  Jan Beulich  <jbeulich@novell.com>
+
+       * config/tc-ia64.c: Include limits.h (if available).
+       (gr_values[0]): Set path to INT_MAX.
+       (dot_reg_val): Don't allow changing value of r0. Limit range of
+       general registers at r127.
+       (specify_resource): Default resource index is -1. Don't set resource
+       index (in case IA64_RS_RSE) without setting the specific flag.
+       (note_register_values): Check operand is O_constant before tracking
+       input value of moves. Add tracking for dep.z with constant inputs.
+       (print_dependency): Resource index of specific resource may be zero.
+       (check_dependencies): Likewise.
+
 2005-02-15  Jan Beulich  <jbeulich@novell.com>
 
        * config/tc-ia64.c (parse_operands): New local variables reg1, reg2,
index c7a6b07884627e0b5cdb2778e0849e9f9a50c71f..4520d0b14ffa3f44333dbbfc328fb87a6b4f9cad 100644 (file)
 
 #include "elf/ia64.h"
 
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
 #define NELEMS(a)      ((int) (sizeof (a)/sizeof ((a)[0])))
 #define MIN(a,b)       ((a) < (b) ? (a) : (b))
 
@@ -627,7 +631,17 @@ static struct gr {
   unsigned known:1;
   int path;
   valueT value;
-} gr_values[128] = {{ 1, 0, 0 }};
+} gr_values[128] = {
+  {
+    1,
+#ifdef INT_MAX
+    INT_MAX,
+#else
+    (((1 << (8 * sizeof(gr_values->path) - 2)) - 1) << 1) + 1,
+#endif
+    0
+  }
+};
 
 /* Remember the alignment frag.  */
 static fragS *align_frag;
@@ -4913,7 +4927,7 @@ dot_reg_val (dummy)
     {
       valueT value = get_absolute_expression ();
       int regno = reg.X_add_number;
-      if (regno < REG_GR || regno > REG_GR + 128)
+      if (regno <= REG_GR || regno > REG_GR + 127)
        as_warn (_("Register value annotation ignored"));
       else
        {
@@ -8060,7 +8074,7 @@ specify_resource (dep, idesc, type, specs, note, path)
   tmpl.link_to_qp_branch = 1;
   tmpl.mem_offset.hint = 0;
   tmpl.specific = 1;
-  tmpl.index = 0;
+  tmpl.index = -1;
   tmpl.cmp_type = CMP_NONE;
 
 #define UNHANDLED \
@@ -9303,8 +9317,7 @@ dep->name, idesc->name, (rsrc_write?"write":"read"), note)
              if (idesc->operands[0] == IA64_OPND_AR3
                  && CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE)
                {
-                 specs[count] = tmpl;
-                 specs[count++].index = 0; /* IA64_RSE_BSPLOAD/RNATBITINDEX */
+                 specs[count++] = tmpl;
                }
            }
          else
@@ -9758,6 +9771,7 @@ note_register_values (idesc)
   else if (idesc->operands[0] == IA64_OPND_R1
           && (idesc->operands[1] == IA64_OPND_IMM22
               || idesc->operands[1] == IA64_OPND_IMMU64)
+          && CURR_SLOT.opnd[1].X_op == O_constant
           && (strcmp (idesc->name, "mov") == 0
               || strcmp (idesc->name, "movl") == 0))
     {
@@ -9775,6 +9789,30 @@ note_register_values (idesc)
            }
        }
     }
+  /* Look for dep.z imm insns.  */
+  else if (idesc->operands[0] == IA64_OPND_R1
+          && idesc->operands[1] == IA64_OPND_IMM8
+          && strcmp (idesc->name, "dep.z") == 0)
+    {
+      int regno = CURR_SLOT.opnd[0].X_add_number - REG_GR;
+      if (regno > 0 && regno < NELEMS (gr_values))
+       {
+         valueT value = CURR_SLOT.opnd[1].X_add_number;
+
+         if (CURR_SLOT.opnd[3].X_add_number < 64)
+           value &= ((valueT)1 << CURR_SLOT.opnd[3].X_add_number) - 1;
+         value <<= CURR_SLOT.opnd[2].X_add_number;
+         gr_values[regno].known = 1;
+         gr_values[regno].value = value;
+         gr_values[regno].path = md.path;
+         if (md.debug_dv)
+           {
+             fprintf (stderr, "  Know gr%d = ", regno);
+             fprintf_vma (stderr, gr_values[regno].value);
+             fputs ("\n", stderr);
+           }
+       }
+    }
   else
     {
       clear_qp_mutex (qp_changemask);
@@ -9995,7 +10033,7 @@ print_dependency (action, depind)
       fprintf (stderr, "  %s %s '%s'",
               action, dv_mode[(regdeps[depind].dependency)->mode],
               (regdeps[depind].dependency)->name);
-      if (regdeps[depind].specific && regdeps[depind].index != 0)
+      if (regdeps[depind].specific && regdeps[depind].index >= 0)
        fprintf (stderr, " (%d)", regdeps[depind].index);
       if (regdeps[depind].mem_offset.hint)
        {
@@ -10193,7 +10231,7 @@ check_dependencies (idesc)
              if (path != 0)
                sprintf (pathmsg, " when entry is at label '%s'",
                         md.entry_labels[path - 1]);
-             if (rs->specific && rs->index != 0)
+             if (matchtype == 1 && rs->index >= 0)
                sprintf (indexmsg, ", specific resource number is %d",
                         rs->index);
              sprintf (msg, "Use of '%s' %s %s dependency '%s' (%s)%s%s",
index 73e2c5d11e4b6d375c586e269a7fc035b4869bd7..849b28f21ed7df6589a5ece9272398b0bc50b186 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-15  Jan Beulich  <jbeulich@novell.com>
+
+       * gas/ia64/dv-raw-err.l: Expect specific resource for RAW violation on b0.
+       * gas/ia64/regval.[ls]: New.
+       * gas/ia64/ia64.exp: Run new test.
+
 2005-02-15  Jan Beulich  <jbeulich@novell.com>
 
        * gas/ia64/dv-raw-err.s: Don't use r0 or f0 as output operand.
index 7dc21f156f824aff430f756ebad57b7ebeea36a7..3ddb095a3203a2d768428ee5913ff26bb0a99983 100644 (file)
@@ -51,7 +51,7 @@
 .*:98: Warning: This is the location of the conflicting usage
 .*:104: Warning: Use of 'ld8\.fill' .* RAW dependency 'AR\[UNAT\]{%}, % in 0 - 63' \(impliedf\)
 .*:103: Warning: This is the location of the conflicting usage
-.*:111: Warning: Use of 'mov' .* RAW dependency 'BR%, % in 0 - 7' \(impliedf\)
+.*:111: Warning: Use of 'mov' .* RAW dependency 'BR%, % in 0 - 7' \(impliedf\), specific resource number is 0
 .*:110: Warning: This is the location of the conflicting usage
 .*:116: Warning: Use of 'fadd' .* RAW dependency 'CFM' \(impliedf\)
 .*:115: Warning: This is the location of the conflicting usage
index c908063b9c97ae7e875b57e9728a230d52f030fa..3a948651154c8594d36ae583cf91a41d8db02517 100644 (file)
@@ -41,6 +41,7 @@ if [istarget "ia64-*"] then {
     gas_test "pred-rel.s" "" "" ".pred.rel alternative forms"
     run_dump_test "dv-safe"
     run_dump_test "dv-srlz"
+    run_list_test "regval" ""
     run_dump_test "tls"
     run_dump_test "ldxmov-1"
     run_list_test "ldxmov-2" ""
diff --git a/gas/testsuite/gas/ia64/regval.l b/gas/testsuite/gas/ia64/regval.l
new file mode 100644 (file)
index 0000000..b12a266
--- /dev/null
@@ -0,0 +1,17 @@
+.*: Assembler messages:
+.*:11: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\), specific resource number is 0
+.*:11: Warning: Only the first path encountering the conflict is reported
+.*:10: Warning: This is the location of the conflicting usage
+#...
+.*:25: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\), specific resource number is 0
+.*:25: Warning: Only the first path encountering the conflict is reported
+.*:24: Warning: This is the location of the conflicting usage
+#...
+.*:32: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\)
+.*:32: Warning: Only the first path encountering the conflict is reported
+.*:31: Warning: This is the location of the conflicting usage
+#...
+.*:46: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\), specific resource number is 0
+.*:46: Warning: Only the first path encountering the conflict is reported
+.*:45: Warning: This is the location of the conflicting usage
+#pass
diff --git a/gas/testsuite/gas/ia64/regval.s b/gas/testsuite/gas/ia64/regval.s
new file mode 100644 (file)
index 0000000..3fb0330
--- /dev/null
@@ -0,0 +1,48 @@
+.explicit
+rr1:
+       .reg.val r1, 0xE000000000000000
+       mov             rr[r0] = r0
+       mov             rr[r1] = r0
+       br.ret.sptk     rp
+       ;;
+rr2:
+       .reg.val r1, 0
+       mov             rr[r0] = r0
+       mov             rr[r1] = r0
+       br.ret.sptk     rp
+       ;;
+rr3:
+       movl            r1 = 0xE000000000000000
+       ;;
+       mov             rr[r0] = r0
+       mov             rr[r1] = r0
+       br.ret.sptk     rp
+       ;;
+rr4:
+       mov             r1 = 0
+       ;;
+       mov             rr[r0] = r0
+       mov             rr[r1] = r0
+       br.ret.sptk     rp
+       ;;
+rr5:
+       movl            r1 = xyz+0xE000000000000000
+       ;;
+       mov             rr[r0] = r0
+       mov             rr[r1] = r0
+       br.ret.sptk     rp
+       ;;
+rr6:
+       dep.z           r1 = 1, 61, 3
+       ;;
+       mov             rr[r0] = r0
+       mov             rr[r1] = r0
+       br.ret.sptk     rp
+       ;;
+rr7:
+       dep.z           r1 = -1, 0, 61
+       ;;
+       mov             rr[r0] = r0
+       mov             rr[r1] = r0
+       br.ret.sptk     rp
+       ;;