aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@tuliptree.org>2001-07-05 02:30:21 +0000
committerJim Wilson <wilson@tuliptree.org>2001-07-05 02:30:21 +0000
commit3e37788f8d4f5cfa856054a2c7aabacdc1dc0bd1 (patch)
treecf1bfd40f0904b5579e4da037fda118200e11c9e
parent2a1e2a6d6e3101f7b7bc031be2b95df14a693f31 (diff)
downloadgdb-3e37788f8d4f5cfa856054a2c7aabacdc1dc0bd1.zip
gdb-3e37788f8d4f5cfa856054a2c7aabacdc1dc0bd1.tar.gz
gdb-3e37788f8d4f5cfa856054a2c7aabacdc1dc0bd1.tar.bz2
Fix 2 ia64-linux gas testsuite failures.
* config/tc-ia64.c (is_conditional_branch): Rewrite to exclude mod sched branches.
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-ia64.c20
2 files changed, 20 insertions, 5 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 5f2137f..9464ac7 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2001-07-04 Jim Wilson <wilson@redhat.com>
+
+ * config/tc-ia64.c (is_conditional_branch): Rewrite to exclude mod
+ sched branches.
+
2001-07-05 Ben Elliston <bje@redhat.com>
* read.c (s_fill): Correct spelling error in comments.
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c
index 0a3dcc6..5ba8157 100644
--- a/gas/config/tc-ia64.c
+++ b/gas/config/tc-ia64.c
@@ -6914,19 +6914,29 @@ ia64_canonicalize_symbol_name (name)
return name;
}
-/* Return true if idesc is a conditional branch instruction. */
+/* Return true if idesc is a conditional branch instruction. This excludes
+ the modulo scheduled branches, and br.ia. Mod-sched branches are excluded
+ because they always read/write resources regardless of the value of the
+ qualifying predicate. br.ia must always use p0, and hence is always
+ taken. Thus this function returns true for branches which can fall
+ through, and which use no resources if they do fall through. */
static int
is_conditional_branch (idesc)
struct ia64_opcode *idesc;
{
/* br is a conditional branch. Everything that starts with br. except
- br.ia is a conditional branch. Everything that starts with brl is a
- conditional branch. */
+ br.ia, br.c{loop,top,exit}, and br.w{top,exit} is a conditional branch.
+ Everything that starts with brl is a conditional branch. */
return (idesc->name[0] == 'b' && idesc->name[1] == 'r'
&& (idesc->name[2] == '\0'
- || (idesc->name[2] == '.' && idesc->name[3] != 'i')
- || idesc->name[2] == 'l'));
+ || (idesc->name[2] == '.' && idesc->name[3] != 'i'
+ && idesc->name[3] != 'c' && idesc->name[3] != 'w')
+ || idesc->name[2] == 'l'
+ /* br.cond, br.call, br.clr */
+ || (idesc->name[2] == '.' && idesc->name[3] == 'c'
+ && (idesc->name[4] == 'a' || idesc->name[4] == 'o'
+ || (idesc->name[4] == 'l' && idesc->name[5] == 'r')))));
}
/* Return whether the given opcode is a taken branch. If there's any doubt,