summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorH.J. Lu <hjl@lucon.org>2003-10-23 06:12:17 +0000
committerH.J. Lu <hjl@lucon.org>2003-10-23 06:12:17 +0000
commit0217aa83c87bd390ba5bbadd05a68bfc55efbbe1 (patch)
treeeb447c6f135aacc6e332d697ad7c282d2e3c0a14 /gas
parent451b8c3895e18abae1ed1955621304b48f14c91c (diff)
downloadbinutils-redhat-0217aa83c87bd390ba5bbadd05a68bfc55efbbe1.tar.gz
gas/
2003-10-22 Andreas Schwab <schwab@suse.de> H.J. Lu <hongjiu.lu@intel.com> Jim Wilson <wilson@specifixinc.com> * config/tc-ia64.c (update_qp_mutex): New. (note_register_values): Properly handle one of PRs in compare is PR0. Don't add a mutex relation for .and.orcm/.or.andcm. Clear mutex relation for .none/.unc. Don't clear mutex relation on predicated compare. testsuite/ 2003-10-22 Andreas Schwab <schwab@suse.de> H.J. Lu <hongjiu.lu@intel.com> * gas/ia64/dv-mutex-err.s: Add more tests for compare. * gas/ia64/dv-mutex.s: Likewise. * gas/ia64/dv-mutex-err.l: Updated. * gas/ia64/dv-mutex.d: Likewise.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog10
-rw-r--r--gas/config/tc-ia64.c111
-rw-r--r--gas/testsuite/ChangeLog9
-rw-r--r--gas/testsuite/gas/ia64/dv-mutex-err.l9
-rw-r--r--gas/testsuite/gas/ia64/dv-mutex-err.s24
-rw-r--r--gas/testsuite/gas/ia64/dv-mutex.d14
-rw-r--r--gas/testsuite/gas/ia64/dv-mutex.s14
7 files changed, 170 insertions, 21 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index c688eb41a8..12ce987908 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2003-10-22 Andreas Schwab <schwab@suse.de>
+ H.J. Lu <hongjiu.lu@intel.com>
+ Jim Wilson <wilson@specifixinc.com>
+
+ * config/tc-ia64.c (update_qp_mutex): New.
+ (note_register_values): Properly handle one of PRs in compare
+ is PR0. Don't add a mutex relation for .and.orcm/.or.andcm.
+ Clear mutex relation for .none/.unc. Don't clear mutex relation
+ on predicated compare.
+
2003-10-21 Wouter van Heyst <wouter@vidicode.nl>
* config/tc-arm.c (all_reg_maps): Correct text describing Maverick
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c
index 24e33c0662..6fb85788d6 100644
--- a/gas/config/tc-ia64.c
+++ b/gas/config/tc-ia64.c
@@ -8726,6 +8726,77 @@ clear_qp_branch_flag (mask)
}
}
+/* MASK contains 2 and only 2 PRs which are mutually exclusive. Remove
+ any mutexes which contain one of the PRs and create new ones when
+ needed. */
+
+static int
+update_qp_mutex (valueT mask)
+{
+ int i;
+ int add = 0;
+
+ i = 0;
+ while (i < qp_mutexeslen)
+ {
+ if ((qp_mutexes[i].prmask & mask) != 0)
+ {
+ /* If it destroys and creates the same mutex, do nothing. */
+ if (qp_mutexes[i].prmask == mask
+ && qp_mutexes[i].path == md.path)
+ {
+ i++;
+ add = -1;
+ }
+ else
+ {
+ int keep = 0;
+
+ if (md.debug_dv)
+ {
+ fprintf (stderr, " Clearing mutex relation");
+ print_prmask (qp_mutexes[i].prmask);
+ fprintf (stderr, "\n");
+ }
+
+ /* Deal with the old mutex with more than 3+ PRs only if
+ the new mutex on the same execution path with it.
+
+ FIXME: The 3+ mutex support is incomplete.
+ dot_pred_rel () may be a better place to fix it. */
+ if (qp_mutexes[i].path == md.path)
+ {
+ /* If it is a proper subset of the mutex, create a
+ new mutex. */
+ if (add == 0
+ && (qp_mutexes[i].prmask & mask) == mask)
+ add = 1;
+
+ qp_mutexes[i].prmask &= ~mask;
+ if (qp_mutexes[i].prmask & (qp_mutexes[i].prmask - 1))
+ {
+ /* Modify the mutex if there are more than one
+ PR left. */
+ keep = 1;
+ i++;
+ }
+ }
+
+ if (keep == 0)
+ /* Remove the mutex. */
+ qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
+ }
+ }
+ else
+ ++i;
+ }
+
+ if (add == 1)
+ add_qp_mutex (mask);
+
+ return add;
+}
+
/* Remove any mutexes which contain any of the PRs indicated in the mask.
Any changes to a PR clears the mutex relations which include that PR. */
@@ -8990,11 +9061,11 @@ note_register_values (idesc)
{
int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
- valueT p1mask = (valueT) 1 << p1;
- valueT p2mask = (valueT) 1 << p2;
+ valueT p1mask = (p1 != 0) ? (valueT) 1 << p1 : 0;
+ valueT p2mask = (p2 != 0) ? (valueT) 1 << p2 : 0;
- /* If one of the PRs is PR0, we can't really do anything. */
- if (p1 == 0 || p2 == 0)
+ /* If both PRs are PR0, we can't really do anything. */
+ if (p1 == 0 && p2 == 0)
{
if (md.debug_dv)
fprintf (stderr, " Ignoring PRs due to inclusion of p0\n");
@@ -9004,7 +9075,6 @@ note_register_values (idesc)
else if (has_suffix_p (idesc->name, ".or.andcm")
|| has_suffix_p (idesc->name, ".and.orcm"))
{
- add_qp_mutex (p1mask | p2mask);
clear_qp_implies (p2mask, p1mask);
}
else if (has_suffix_p (idesc->name, ".andcm")
@@ -9020,26 +9090,29 @@ note_register_values (idesc)
}
else
{
+ int added = 0;
+
clear_qp_implies (p1mask | p2mask, p1mask | p2mask);
- if (has_suffix_p (idesc->name, ".unc"))
+
+ /* If one of the PRs is PR0, we call clear_qp_mutex. */
+ if (p1 == 0 || p2 == 0)
+ clear_qp_mutex (p1mask | p2mask);
+ else
+ added = update_qp_mutex (p1mask | p2mask);
+
+ if (CURR_SLOT.qp_regno == 0
+ || has_suffix_p (idesc->name, ".unc"))
{
- add_qp_mutex (p1mask | p2mask);
+ if (added == 0 && p1 && p2)
+ add_qp_mutex (p1mask | p2mask);
if (CURR_SLOT.qp_regno != 0)
{
- add_qp_imply (CURR_SLOT.opnd[0].X_add_number - REG_P,
- CURR_SLOT.qp_regno);
- add_qp_imply (CURR_SLOT.opnd[1].X_add_number - REG_P,
- CURR_SLOT.qp_regno);
+ if (p1)
+ add_qp_imply (p1, CURR_SLOT.qp_regno);
+ if (p2)
+ add_qp_imply (p2, CURR_SLOT.qp_regno);
}
}
- else if (CURR_SLOT.qp_regno == 0)
- {
- add_qp_mutex (p1mask | p2mask);
- }
- else
- {
- clear_qp_mutex (p1mask | p2mask);
- }
}
}
/* Look for mov imm insns into GRs. */
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 87e242c24a..0b33c0cd9d 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2003-10-22 Andreas Schwab <schwab@suse.de>
+ H.J. Lu <hongjiu.lu@intel.com>
+
+ * gas/ia64/dv-mutex-err.s: Add more tests for compare.
+ * gas/ia64/dv-mutex.s: Likewise.
+
+ * gas/ia64/dv-mutex-err.l: Updated.
+ * gas/ia64/dv-mutex.d: Likewise.
+
2003-10-18 Hans-Peter Nilsson <hp@bitrange.com>
* gas/mmix/op-0-1.d, gas/mmix/pushj-c.d, gas/mmix/weak1.d: Add
diff --git a/gas/testsuite/gas/ia64/dv-mutex-err.l b/gas/testsuite/gas/ia64/dv-mutex-err.l
index a6df710b8e..17960be125 100644
--- a/gas/testsuite/gas/ia64/dv-mutex-err.l
+++ b/gas/testsuite/gas/ia64/dv-mutex-err.l
@@ -2,3 +2,12 @@
.*:9: Warning: Use of 'ld8' .* RAW dependency 'GR%, % in 1 - 127' \(impliedf\), specific resource number is 26
.*:9: Warning: Only the first path encountering the conflict is reported
.*:8: Warning: This is the location of the conflicting usage
+.*:14: Warning: Use of 'mov' may violate WAW dependency 'GR%, % in 1 - 127' \(impliedf\), specific resource number is 4
+.*:14: Warning: Only the first path encountering the conflict is reported
+.*:13: Warning: This is the location of the conflicting usage
+.*:20: Warning: Use of 'mov' may violate WAW dependency 'GR%, % in 1 - 127' \(impliedf\), specific resource number is 4
+.*:19: Warning: This is the location of the conflicting usage
+.*:26: Warning: Use of 'mov' may violate WAW dependency 'GR%, % in 1 - 127' \(impliedf\), specific resource number is 4
+.*:25: Warning: This is the location of the conflicting usage
+.*:32: Warning: Use of 'mov' may violate WAW dependency 'GR%, % in 1 - 127' \(impliedf\), specific resource number is 4
+.*:31: Warning: This is the location of the conflicting usage
diff --git a/gas/testsuite/gas/ia64/dv-mutex-err.s b/gas/testsuite/gas/ia64/dv-mutex-err.s
index e6eaaaacdf..dc391990cb 100644
--- a/gas/testsuite/gas/ia64/dv-mutex-err.s
+++ b/gas/testsuite/gas/ia64/dv-mutex-err.s
@@ -7,3 +7,27 @@ start:
cmp.eq p6, p0 = r29, r0
add r26 = r26, r29
ld8 r29 = [r26]
+
+ .pred.rel.mutex p1, p2
+ cmp.eq p0, p1 = r1, r2;;
+(p1) mov r4 = 2
+(p2) mov r4 = 4
+ rfi
+
+ .pred.rel.mutex p1, p2
+(p3) cmp.eq p0, p1 = r1, r2;;
+(p1) mov r4 = 2
+(p2) mov r4 = 4
+ rfi
+
+ .pred.rel.mutex p1, p2
+ cmp.eq p2, p3 = r1, r2;;
+(p1) mov r4 = 2
+(p2) mov r4 = 4
+ rfi
+
+ .pred.rel.mutex p1, p2
+(p3) cmp.eq p2, p3 = r1, r2;;
+(p1) mov r4 = 2
+(p2) mov r4 = 4
+ rfi
diff --git a/gas/testsuite/gas/ia64/dv-mutex.d b/gas/testsuite/gas/ia64/dv-mutex.d
index 247c42ef8c..2926ab2cbc 100644
--- a/gas/testsuite/gas/ia64/dv-mutex.d
+++ b/gas/testsuite/gas/ia64/dv-mutex.d
@@ -19,9 +19,21 @@ Disassembly of section \.text:
30: 1d 00 00 00 01 00 \[MFB\] nop\.m 0x0
36: 00 00 00 02 00 00 nop\.f 0x0
3c: 00 00 20 00 rfi;;
- 40: 60 08 06 04 02 78 \[MII\] \(p03\) cmp\.eq\.unc p1,p2=r1,r2
+ 40: 6a 08 06 04 02 78 \[MMI\] \(p03\) cmp\.eq\.unc p1,p2=r1,r2;;
46: 40 10 00 00 42 81 \(p01\) mov r4=2
4c: 40 00 00 84 \(p02\) mov r4=4
50: 1d 00 00 00 01 00 \[MFB\] nop\.m 0x0
56: 00 00 00 02 00 00 nop\.f 0x0
5c: 00 00 20 00 rfi;;
+ 60: 0a 08 04 04 02 78 \[MMI\] cmp\.eq p1,p2=r1,r2;;
+ 66: 40 10 00 00 42 81 \(p01\) mov r4=2
+ 6c: 40 00 00 84 \(p02\) mov r4=4
+ 70: 1d 00 00 00 01 00 \[MFB\] nop\.m 0x0
+ 76: 00 00 00 02 00 00 nop\.f 0x0
+ 7c: 00 00 20 00 rfi;;
+ 80: 6a 08 04 04 02 78 \[MMI\] \(p03\) cmp\.eq p1,p2=r1,r2;;
+ 86: 40 10 00 00 42 81 \(p01\) mov r4=2
+ 8c: 40 00 00 84 \(p02\) mov r4=4
+ 90: 1d 00 00 00 01 00 \[MFB\] nop\.m 0x0
+ 96: 00 00 00 02 00 00 nop\.f 0x0
+ 9c: 00 00 20 00 rfi;;
diff --git a/gas/testsuite/gas/ia64/dv-mutex.s b/gas/testsuite/gas/ia64/dv-mutex.s
index 8704b27431..c1841df9df 100644
--- a/gas/testsuite/gas/ia64/dv-mutex.s
+++ b/gas/testsuite/gas/ia64/dv-mutex.s
@@ -17,7 +17,19 @@ start:
rfi
// unconditional compares generate a mutex
-(p3) cmp.eq.unc p1, p2 = r1, r2
+(p3) cmp.eq.unc p1, p2 = r1, r2;;
+(p1) mov r4 = 2
+(p2) mov r4 = 4
+ rfi
+
+// non-predicated compares don't remove mutex
+ cmp.eq p1, p2 = r1, r2;;
+(p1) mov r4 = 2
+(p2) mov r4 = 4
+ rfi
+
+// predicated compares don't remove mutex
+(p3) cmp.eq p1, p2 = r1, r2;;
(p1) mov r4 = 2
(p2) mov r4 = 4
rfi