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.
This commit is contained in:
parent
df407dfe2e
commit
a1ace8d858
7 changed files with 56 additions and 11 deletions
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
Loading…
Reference in a new issue