aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@acm.org>2004-11-12 21:59:13 +0000
committerBob Wilson <bob.wilson@acm.org>2004-11-12 21:59:13 +0000
commita1ace8d8587718c6ccbd4bc9c7c4a2907866ee91 (patch)
treeb694091a00edd14027076abdfacf7db9454f34f1
parentdf407dfe2e8452c0a3edfcf50d55942ff0273433 (diff)
downloadgdb-a1ace8d8587718c6ccbd4bc9c7c4a2907866ee91.zip
gdb-a1ace8d8587718c6ccbd4bc9c7c4a2907866ee91.tar.gz
gdb-a1ace8d8587718c6ccbd4bc9c7c4a2907866ee91.tar.bz2
2004-11-12 Bob Wilson <bob.wilson@acm.org>
include/ChangeLog * xtensa-isa-internal.h (xtensa_interface_internal): Add class_id. * xtensa-isa.h (xtensa_interface_class_id): New prototype. bfd/ChangeLog * xtensa-isa.c (xtensa_interface_class_id): New. gas/ChangeLog * config/tc-xtensa.c (finish_vinsn): Clear pending instruction if there is a conflict. (check_t1_t2_reads_and_writes): Check for both reads and writes to interfaces that are related as determined by xtensa_interface_class_id.
-rw-r--r--bfd/ChangeLog4
-rw-r--r--bfd/xtensa-isa.c9
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/tc-xtensa.c28
-rw-r--r--include/ChangeLog5
-rw-r--r--include/xtensa-isa-internal.h1
-rw-r--r--include/xtensa-isa.h13
7 files changed, 56 insertions, 11 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ed41ba2..eb1b718 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,7 @@
+2004-11-12 Bob Wilson <bob.wilson@acm.org>
+
+ * xtensa-isa.c (xtensa_interface_class_id): New.
+
2004-11-11 Bob Wilson <bob.wilson@acm.org>
* elf32-xtensa.c (property_table_compare): Remove assertion about
diff --git a/bfd/xtensa-isa.c b/bfd/xtensa-isa.c
index 30ad80c..f5fa3c2 100644
--- a/bfd/xtensa-isa.c
+++ b/bfd/xtensa-isa.c
@@ -1677,6 +1677,15 @@ xtensa_interface_has_side_effect (xtensa_isa isa, xtensa_interface intf)
return 0;
}
+
+int
+xtensa_interface_class_id (xtensa_isa isa, xtensa_interface intf)
+{
+ xtensa_isa_internal *intisa = (xtensa_isa_internal *) isa;
+ CHECK_INTERFACE (intisa, intf, XTENSA_UNDEFINED);
+ return intisa->interfaces[intf].class_id;
+}
+
/* Functional Units. */
diff --git a/gas/ChangeLog b/gas/ChangeLog
index bda1a36..2eaae59 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2004-11-12 Bob Wilson <bob.wilson@acm.org>
+
+ * config/tc-xtensa.c (finish_vinsn): Clear pending instruction if
+ there is a conflict.
+ (check_t1_t2_reads_and_writes): Check for both reads and writes to
+ interfaces that are related as determined by xtensa_interface_class_id.
+
2004-11-12 Nick Clifton <nickc@redhat.com>
* config/tc-mn10300.c (md_relax_table): Fix off by one negative
diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c
index 8f36230..88ddf17 100644
--- a/gas/config/tc-xtensa.c
+++ b/gas/config/tc-xtensa.c
@@ -6013,7 +6013,7 @@ opcode_funcUnit_use_stage (void *data, xtensa_opcode opcode, int idx)
solely whether the hardware is available to execute the given
instructions together. It also doesn't check if the tinsns
write the same state, or access the same tieports. That is
- checked by check_t1_t2_read_write. */
+ checked by check_t1_t2_reads_and_writes. */
static bfd_boolean
resources_conflict (vliw_insn *vinsn)
@@ -6069,7 +6069,10 @@ finish_vinsn (vliw_insn *vinsn)
int line;
if (find_vinsn_conflicts (vinsn))
- return;
+ {
+ xg_clear_vinsn (vinsn);
+ return;
+ }
/* First, find a format that works. */
if (vinsn->format == XTENSA_UNDEFINED)
@@ -6326,7 +6329,7 @@ find_vinsn_conflicts (vliw_insn *vinsn)
}
-/* Check how the result registers of t1 and t2 relate.
+/* Check how the state used by t1 and t2 relate.
Cases found are:
case A: t1 reads a register t2 writes (an antidependency within a bundle)
@@ -6336,7 +6339,7 @@ find_vinsn_conflicts (vliw_insn *vinsn)
bundle)
case D: t1 writes a state that t2 also writes
case E: t1 writes a tie queue that t2 also writes
- case F: two volatile queue writes
+ case F: two volatile queue accesses
*/
static char
@@ -6459,18 +6462,24 @@ check_t1_t2_reads_and_writes (TInsn *t1, TInsn *t2)
{
xtensa_interface t2_int
= xtensa_interfaceOperand_interface (isa, t2->opcode, j);
+ int t2_class = xtensa_interface_class_id (isa, t2_int);
+
t2_inout = xtensa_interface_inout (isa, j);
- if (xtensa_interface_has_side_effect (isa, t2_int) == 1
- && t2_inout != 'i')
+ if (xtensa_interface_has_side_effect (isa, t2_int) == 1)
t2_volatile = TRUE;
+
for (i = 0; i < t1_interfaces; i++)
{
xtensa_interface t1_int
= xtensa_interfaceOperand_interface (isa, t1->opcode, j);
+ int t1_class = xtensa_interface_class_id (isa, t2_int);
+
t1_inout = xtensa_interface_inout (isa, i);
- if (xtensa_interface_has_side_effect (isa, t1_int) == 1
- && t1_inout != 'i')
+ if (xtensa_interface_has_side_effect (isa, t1_int) == 1)
t1_volatile = TRUE;
+
+ if (t1_volatile && t2_volatile && (t1_class == t2_class))
+ return 'f';
if (t1_int != t2_int)
continue;
@@ -6491,9 +6500,6 @@ check_t1_t2_reads_and_writes (TInsn *t1, TInsn *t2)
return 'e';
}
}
-
- if (t1_volatile && t2_volatile)
- return 'f';
return conflict;
}
diff --git a/include/ChangeLog b/include/ChangeLog
index 7ee396b..de51a8f 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2004-11-12 Bob Wilson <bob.wilson@acm.org>
+
+ * xtensa-isa-internal.h (xtensa_interface_internal): Add class_id.
+ * xtensa-isa.h (xtensa_interface_class_id): New prototype.
+
2004-11-08 Inderpreet Singh <inderpreetb@nioda.hcltech.com>
Vineet Sharma <vineets@noida.hcltech.com>
diff --git a/include/xtensa-isa-internal.h b/include/xtensa-isa-internal.h
index 50ac478..44e53f9 100644
--- a/include/xtensa-isa-internal.h
+++ b/include/xtensa-isa-internal.h
@@ -131,6 +131,7 @@ typedef struct xtensa_interface_internal_struct
const char *name; /* Interface name. */
int num_bits; /* Width of the interface. */
uint32 flags; /* See XTENSA_INTERFACE_* flags. */
+ int class_id; /* Class of related interfaces. */
char inout; /* "i" or "o". */
} xtensa_interface_internal;
diff --git a/include/xtensa-isa.h b/include/xtensa-isa.h
index 2dc11b9..025e317 100644
--- a/include/xtensa-isa.h
+++ b/include/xtensa-isa.h
@@ -755,6 +755,19 @@ xtensa_interface_inout (xtensa_isa isa, xtensa_interface intf);
extern int
xtensa_interface_has_side_effect (xtensa_isa isa, xtensa_interface intf);
+
+/* Some interfaces may be related such that accessing one interface
+ has side effects on a set of related interfaces. The interfaces
+ are partitioned into equivalence classes of related interfaces, and
+ each class is assigned a unique identifier number. This function
+ returns the class identifier for an interface, or XTENSA_UNDEFINED
+ on error. These identifiers can be compared to determine if two
+ interfaces are related; the specific values of the identifiers have
+ no particular meaning otherwise. */
+
+extern int
+xtensa_interface_class_id (xtensa_isa isa, xtensa_interface intf);
+
/* Functional Units. */