From 5e2f667360034a737d84a8ad437c71315151e04c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 23 Oct 2003 06:12:17 +0000 Subject: [PATCH] gas/ 2003-10-22 Andreas Schwab H.J. Lu Jim Wilson * 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 H.J. Lu * 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. --- gas/ChangeLog | 10 +++ gas/config/tc-ia64.c | 111 +++++++++++++++++++++----- gas/testsuite/ChangeLog | 9 +++ gas/testsuite/gas/ia64/dv-mutex-err.l | 9 +++ gas/testsuite/gas/ia64/dv-mutex-err.s | 24 ++++++ gas/testsuite/gas/ia64/dv-mutex.d | 14 +++- gas/testsuite/gas/ia64/dv-mutex.s | 14 +++- 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 + H.J. Lu + Jim Wilson + + * 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 * 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 + H.J. Lu + + * 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 * 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