summaryrefslogtreecommitdiffstats
path: root/gas
diff options
context:
space:
mode:
authorTimothy Wall <twall@alum.mit.edu>2000-09-14 21:37:04 +0000
committerTimothy Wall <twall@alum.mit.edu>2000-09-14 21:37:04 +0000
commit7484b8e6d911ef13ec4197a4b8334220c41f7dc4 (patch)
tree274e8151e197b5f513e48b4a62ed99c907e09f17 /gas
parent74d1c347e92b42c9d546fbe67d7a572a72c54a41 (diff)
downloadppe42-binutils-7484b8e6d911ef13ec4197a4b8334220c41f7dc4.tar.gz
ppe42-binutils-7484b8e6d911ef13ec4197a4b8334220c41f7dc4.zip
Eliminate false DVs on parallel compares.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-ia64.c64
-rw-r--r--gas/testsuite/ChangeLog5
-rw-r--r--gas/testsuite/gas/ia64/dv-waw-err.l24
-rw-r--r--gas/testsuite/gas/ia64/dv-waw-err.s29
5 files changed, 123 insertions, 7 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 2b893d4a17..1e1ef03c2a 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+2000-09-14 Timothy Wall <twall@cygnus.com>
+
+ * config/tc-ia64.c (specify_resource): For PR%/PR63, note types of
+ parallel comparisons for later use.
+ (struct rsrc): Add parallel comparison type.
+ (resources_match): Skip special cases of PR usage (non-conflicting
+ parallel compares).
+
2000-09-13 Kazu Hirata <kazu@hxi.com>
* config/obj-ecoff.c: Fix formatting.
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c
index 7e0193d3e7..25cdfcdf37 100644
--- a/gas/config/tc-ia64.c
+++ b/gas/config/tc-ia64.c
@@ -521,6 +521,7 @@ static struct rsrc {
char *file; /* what file marked this dependency */
int line; /* what line marked this dependency */
struct mem_offset mem_offset; /* optional memory offset hint */
+ enum { CMP_NONE, CMP_OR, CMP_AND } cmp_type; /* OR or AND compare? */
int path; /* corresponding code entry index */
} *regdeps = NULL;
static int regdepslen = 0;
@@ -528,6 +529,7 @@ static int regdepstotlen = 0;
static const char *dv_mode[] = { "RAW", "WAW", "WAR" };
static const char *dv_sem[] = { "none", "implied", "impliedf",
"data", "instr", "specific", "other" };
+static const char *dv_cmp_type[] = { "none", "OR", "AND" };
/* Current state of PR mutexation */
static struct qpmutex {
@@ -6374,6 +6376,7 @@ specify_resource (dep, idesc, type, specs, note, path)
tmpl.mem_offset.hint = 0;
tmpl.specific = 1;
tmpl.index = 0;
+ tmpl.cmp_type = CMP_NONE;
#define UNHANDLED \
as_warn (_("Unhandled dependency %s for %s (%s), note %d"), \
@@ -7008,11 +7011,16 @@ dep->name, idesc->name, (rsrc_write?"write":"read"), note)
{
int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
+ int or_andcm = strstr(idesc->name, "or.andcm") != NULL;
+ int and_orcm = strstr(idesc->name, "and.orcm") != NULL;
+
if ((idesc->operands[0] == IA64_OPND_P1
|| idesc->operands[0] == IA64_OPND_P2)
&& p1 != 0 && p1 != 63)
{
specs[count] = tmpl;
+ specs[count].cmp_type =
+ (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
specs[count++].index = p1;
}
if ((idesc->operands[1] == IA64_OPND_P1
@@ -7020,6 +7028,8 @@ dep->name, idesc->name, (rsrc_write?"write":"read"), note)
&& p2 != 0 && p2 != 63)
{
specs[count] = tmpl;
+ specs[count].cmp_type =
+ (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
specs[count++].index = p2;
}
}
@@ -7462,13 +7472,27 @@ dep->name, idesc->name, (rsrc_write?"write":"read"), note)
{
if (rsrc_write)
{
- for (i = 0; i < idesc->num_outputs; i++)
- if ((idesc->operands[i] == IA64_OPND_P1
- || idesc->operands[i] == IA64_OPND_P2)
- && CURR_SLOT.opnd[i].X_add_number - REG_P == 63)
- {
- specs[count++] = tmpl;
- }
+ int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
+ int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
+ int or_andcm = strstr(idesc->name, "or.andcm") != NULL;
+ int and_orcm = strstr(idesc->name, "and.orcm") != NULL;
+
+ if (p1 == 63
+ && (idesc->operands[0] == IA64_OPND_P1
+ || idesc->operands[0] == IA64_OPND_P2))
+ {
+ specs[count] = tmpl;
+ specs[count++].cmp_type =
+ (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
+ }
+ if (p2 == 63
+ && (idesc->operands[1] == IA64_OPND_P1
+ || idesc->operands[1] == IA64_OPND_P2))
+ {
+ specs[count] = tmpl;
+ specs[count++].cmp_type =
+ (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
+ }
}
else
{
@@ -7951,6 +7975,32 @@ resources_match (rs, idesc, note, qp_regno, path)
}
}
+ /* Skip apparent PR write conflicts where both writes are an AND or both
+ writes are an OR. */
+ if (rs->dependency->specifier == IA64_RS_PR
+ || rs->dependency->specifier == IA64_RS_PR63)
+ {
+ if (specs[count].cmp_type != CMP_NONE
+ && specs[count].cmp_type == rs->cmp_type)
+ {
+ if (md.debug_dv)
+ fprintf (stderr, " %s on parallel compare allowed (PR%d)\n",
+ dv_mode[rs->dependency->mode],
+ rs->dependency->specifier == IA64_RS_PR ?
+ specs[count].index : 63);
+ continue;
+ }
+ if (md.debug_dv)
+ fprintf (stderr,
+ " %s on parallel compare conflict %s vs %s on PR%d\n",
+ dv_mode[rs->dependency->mode],
+ dv_cmp_type[rs->cmp_type],
+ dv_cmp_type[specs[count].cmp_type],
+ rs->dependency->specifier == IA64_RS_PR ?
+ specs[count].index : 63);
+
+ }
+
/* If either resource is not specific, conservatively assume a conflict
*/
if (!specs[count].specific || !rs->specific)
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 2b1d5582a4..16aa307f68 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2000-09-14 Timothy Wall <twall@cygnus.com>
+
+ * gas/ia64/dv-waw-err.[sl]: Additional tests for parallel
+ comparisons which should and should not produce DVs.
+
2000-09-05 Alan Modra <alan@linuxcare.com.au>
* gas/vtable/vtable.exp: Re-enable for hppa-elf.
diff --git a/gas/testsuite/gas/ia64/dv-waw-err.l b/gas/testsuite/gas/ia64/dv-waw-err.l
index 51fb26a6fc..2a79088103 100644
--- a/gas/testsuite/gas/ia64/dv-waw-err.l
+++ b/gas/testsuite/gas/ia64/dv-waw-err.l
@@ -351,3 +351,27 @@
.*:507: Warning: This is the location of the conflicting usage
.*:513: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\), specific resource number is 7
.*:512: Warning: This is the location of the conflicting usage
+.*:537: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 7
+.*:536: Warning: This is the location of the conflicting usage
+.*:537: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 6
+.*:536: Warning: This is the location of the conflicting usage
+.*:537: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 7
+.*:536: Warning: This is the location of the conflicting usage
+.*:537: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 6
+.*:536: Warning: This is the location of the conflicting usage
+.*:540: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 7
+.*:539: Warning: This is the location of the conflicting usage
+.*:540: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 7
+.*:539: Warning: This is the location of the conflicting usage
+.*:540: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR63' \(impliedf\)
+.*:539: Warning: This is the location of the conflicting usage
+.*:540: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR63' \(impliedf\)
+.*:539: Warning: This is the location of the conflicting usage
+.*:543: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 6
+.*:542: Warning: This is the location of the conflicting usage
+.*:543: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR%.*' \(impliedf\), specific resource number is 6
+.*:542: Warning: This is the location of the conflicting usage
+.*:543: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR63' \(impliedf\)
+.*:542: Warning: This is the location of the conflicting usage
+.*:543: Warning: Use of 'cmp.eq.and.orcm' .* WAW .* 'PR63' \(impliedf\)
+.*:542: Warning: This is the location of the conflicting usage
diff --git a/gas/testsuite/gas/ia64/dv-waw-err.s b/gas/testsuite/gas/ia64/dv-waw-err.s
index c6f4fe0cba..631c7f3d44 100644
--- a/gas/testsuite/gas/ia64/dv-waw-err.s
+++ b/gas/testsuite/gas/ia64/dv-waw-err.s
@@ -513,4 +513,33 @@
mov rr[r2] = r3
;;
// RSE
+
+// PR, additional cases (or.andcm and and.orcm interaction)
+ cmp.eq.or.andcm p6, p7 = 1, r32
+ cmp.eq.or.andcm p6, p7 = 5, r36 // no DV here
+ ;;
+ cmp.eq.and.orcm p6, p7 = 1, r32
+ cmp.eq.and.orcm p6, p7 = 5, r36 // no DV here
+ ;;
+ cmp.eq.or.andcm p63, p7 = 1, r32
+ cmp.eq.or.andcm p63, p7 = 5, r36 // no DV here
+ ;;
+ cmp.eq.or.andcm p6, p63 = 1, r32
+ cmp.eq.or.andcm p6, p63 = 5, r36 // no DV here
+ ;;
+ cmp.eq.and.orcm p63, p7 = 1, r32
+ cmp.eq.and.orcm p63, p7 = 5, r36 // no DV here
+ ;;
+ cmp.eq.and.orcm p6, p63 = 1, r32
+ cmp.eq.and.orcm p6, p63 = 5, r36 // no DV here
+ ;;
+ cmp.eq.or.andcm p6, p7 = 1, r32
+ cmp.eq.and.orcm p6, p7 = 5, r36
+ ;;
+ cmp.eq.or.andcm p63, p7 = 1, r32
+ cmp.eq.and.orcm p63, p7 = 5, r36
+ ;;
+ cmp.eq.or.andcm p6, p63 = 1, r32
+ cmp.eq.and.orcm p6, p63 = 5, r36
+ ;;
L:
OpenPOWER on IntegriCloud