+2010-06-18 Joseph Myers <joseph@codesourcery.com>
+
+ * 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.
+
2010-06-15 Joseph Myers <joseph@codesourcery.com>
* config/tc-tic6x.c: Include elf/tic6x.h.
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
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)
= 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)
||^); 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
+2010-06-18 Joseph Myers <joseph@codesourcery.com>
+
+ * 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.
+
2010-06-16 Vincent Rivière <vincent.riviere@freesbee.fr>
PR gas/11673
--- /dev/null
+#name: C6X parallel instructions on same functional unit
+#error-output: resource-func-unit-1.l
--- /dev/null
+[^:]*: Assembler messages:
+[^:]*:9: Error: functional unit already used in this execute packet
--- /dev/null
+# Test parallel instructions on same functional unit.
+.text
+.globl f
+f:
+ add .L1 a1,a2,a3
+ nop
+ || [b1] add .L1 a1,a2,a3
+ || nop
+ || [!b1] add .L1 a4,a5,a6
--- /dev/null
+#name: C6X parallel instructions on same functional unit, multiple sections
+#error-output: resource-func-unit-2.l
--- /dev/null
+[^:]*: Assembler messages:
+[^:]*:17: Error: functional unit already used in this execute packet
+[^:]*:19: Error: functional unit already used in this execute packet
--- /dev/null
+# Test parallel instructions on same functional unit, with section switching.
+.section .text.f1,"ax",%progbits
+.globl f1
+f1:
+ add .L1 a1,a2,a3
+ nop
+ || [b1] add .L1 a1,a2,a3
+.section .text.f2,"ax",%progbits
+.globl f2
+f2:
+ add .L2 b1,b2,b3
+ nop
+ || [b1] add .L2 b1,b2,b3
+ || nop
+.section .text.f1,"ax",%progbits
+ || nop
+ || [!b1] add .L1 a4,a5,a6
+.section .text.f2,"ax",%progbits
+ || [!b1] add .L2 b4,b5,b6