aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2010-06-18 22:44:20 +0000
committerJoseph Myers <joseph@codesourcery.com>2010-06-18 22:44:20 +0000
commit38bd8d09ffe9e298c29172609b358c34cfd7e11b (patch)
treee039928ad43fe500786d05e483c762399922b626 /gas/config
parent6aed2dbcba548376cdc0b98231fb9b174f9ca978 (diff)
downloadgdb-38bd8d09ffe9e298c29172609b358c34cfd7e11b.zip
gdb-38bd8d09ffe9e298c29172609b358c34cfd7e11b.tar.gz
gdb-38bd8d09ffe9e298c29172609b358c34cfd7e11b.tar.bz2
gas:
* config/tc-tic6x.h (tic6x_segment_info_type): Add field func_units_used. * config/tc-tic6x.c (tic6x_cons_align: Clear func_units_used. (md_assemble): Clear func_units_used for new execute packet. Check for duplicate functional units and update func_units_used for instructions using a functional unit. gas/testsuite: * gas/tic6x/resource-func-unit-1.d, gas/tic6x/resource-func-unit-1.l, gas/tic6x/resource-func-unit-1.s, gas/tic6x/resource-func-unit-2.d, gas/tic6x/resource-func-unit-2.l, gas/tic6x/resource-func-unit-2.s: New.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/tc-tic6x.c14
-rw-r--r--gas/config/tc-tic6x.h5
2 files changed, 19 insertions, 0 deletions
diff --git a/gas/config/tc-tic6x.c b/gas/config/tc-tic6x.c
index 9c40c15..ea750ba 100644
--- a/gas/config/tc-tic6x.c
+++ b/gas/config/tc-tic6x.c
@@ -633,6 +633,7 @@ tic6x_cons_align (int n ATTRIBUTE_UNUSED)
seginfo->tc_segment_info_data.execute_packet_frag = NULL;
seginfo->tc_segment_info_data.last_insn_lsb = NULL;
seginfo->tc_segment_info_data.spmask_addr = NULL;
+ seginfo->tc_segment_info_data.func_units_used = 0;
}
/* Handle an alignment directive. Return TRUE if the
@@ -3155,6 +3156,7 @@ md_assemble (char *str)
tic6x_label_list *l;
seginfo->tc_segment_info_data.spmask_addr = NULL;
+ seginfo->tc_segment_info_data.func_units_used = 0;
/* Start a new frag for this execute packet. */
if (frag_now_fix () != 0)
@@ -3184,6 +3186,18 @@ md_assemble (char *str)
= tic6x_can_cross_fp_boundary;
}
+ if (func_unit_base != tic6x_func_unit_nfu)
+ {
+ unsigned int func_unit_enc;
+
+ func_unit_enc = tic6x_encode_spmask (func_unit_base, func_unit_side);
+
+ if (seginfo->tc_segment_info_data.func_units_used & func_unit_enc)
+ as_bad (_("functional unit already used in this execute packet"));
+
+ seginfo->tc_segment_info_data.func_units_used |= func_unit_enc;
+ }
+
if (opct->flags & TIC6X_FLAG_SPLOOP)
{
if (seginfo->tc_segment_info_data.sploop_ii)
diff --git a/gas/config/tc-tic6x.h b/gas/config/tc-tic6x.h
index c9df520..d4a3795 100644
--- a/gas/config/tc-tic6x.h
+++ b/gas/config/tc-tic6x.h
@@ -67,6 +67,11 @@ typedef struct
||^); otherwise NULL. */
char *spmask_addr;
+ /* The functional units used in the current execute packet, recorded
+ by setting the same bits as would be set in the 32-bit SPMASK
+ instruction. */
+ unsigned int func_units_used;
+
/* If an SPLOOP-family instruction has been seen, and a following
SPKERNEL-family instruction has not yet been seen, the ii value
from the SPLOOP instruction (in the range 1 to 14); otherwise