[PATCH] ia64 dependency violation diagnostics
Jan Beulich
JBeulich@novell.com
Thu Feb 10 16:41:00 GMT 2005
Previously, the assembler
- allowed changing the value of r0 through .reg.val
- didn't consider r0 to be constant zero after the first label
- in dependency violation diagnostics, didn't point to the specific
resource
when the index of it was zero
- considered relocatable (immediate) input operands of moves as having
a
known (at assembly time) value
- didn't deal with the common case of setting a register to a constant
value
through dep.z
Built and tested on ia64-unknown-linux-gnu.
Jan
gas/
2005-02-10 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-10 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.
---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/config/tc-ia64.c 2005-02-02
08:33:18.000000000 +0100
+++ 2005-02-08/gas/config/tc-ia64.c 2005-02-10 13:55:42.562935575
+0100
@@ -51,6 +51,10 @@
#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))
@@ -635,7 +639,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;
@@ -4837,7 +4851,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
{
@@ -7827,7 +7841,7 @@ specify_resource (dep, idesc, type, spec
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 \
@@ -9070,8 +9084,7 @@ dep->name, idesc->name, (rsrc_write?"wri
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
@@ -9525,6 +9538,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))
{
@@ -9542,6 +9556,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);
@@ -9762,7 +9800,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)
{
@@ -9960,7 +9998,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",
---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/dv-raw-err.l 2004-06-16
15:23:12.000000000 +0200
+++ 2005-02-08/gas/testsuite/gas/ia64/dv-raw-err.l 2005-02-10
13:55:42.563912137 +0100
@@ -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
---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/ia64.exp 2005-02-02
08:33:18.000000000 +0100
+++ 2005-02-08/gas/testsuite/gas/ia64/ia64.exp 2005-02-10
13:55:42.564888700 +0100
@@ -40,6 +40,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" ""
---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/regval.l 1970-01-01
01:00:00.000000000 +0100
+++ 2005-02-08/gas/testsuite/gas/ia64/regval.l 2005-02-10
13:00:19.000000000 +0100
@@ -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
---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/regval.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-02-08/gas/testsuite/gas/ia64/regval.s 2005-02-10
12:59:46.000000000 +0100
@@ -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
+ ;;
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: binutils-mainline-ia64-dv-diags.patch
URL: <https://sourceware.org/pipermail/binutils/attachments/20050210/4b35f2e2/attachment.ksh>
More information about the Binutils
mailing list