gas:
authorJoseph Myers <joseph@codesourcery.com>
Fri, 18 Jun 2010 22:44:20 +0000 (22:44 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 18 Jun 2010 22:44:20 +0000 (22:44 +0000)
* 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.

gas/ChangeLog
gas/config/tc-tic6x.c
gas/config/tc-tic6x.h
gas/testsuite/ChangeLog
gas/testsuite/gas/tic6x/resource-func-unit-1.d [new file with mode: 0644]
gas/testsuite/gas/tic6x/resource-func-unit-1.l [new file with mode: 0644]
gas/testsuite/gas/tic6x/resource-func-unit-1.s [new file with mode: 0644]
gas/testsuite/gas/tic6x/resource-func-unit-2.d [new file with mode: 0644]
gas/testsuite/gas/tic6x/resource-func-unit-2.l [new file with mode: 0644]
gas/testsuite/gas/tic6x/resource-func-unit-2.s [new file with mode: 0644]

index 1bce7a45236b3df96cd0fce10f54ff3c4a7390ef..83ed094aac3a523e583a95a0b82c5b15bc7569f9 100644 (file)
@@ -1,3 +1,12 @@
+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.
index 9c40c15a3e9db07167d4a078179389c694553d6f..ea750ba5c306125522239b4dc7937431060a19e6 100644 (file)
@@ -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)
index c9df520b4b6c9d0d37048c4facabd4013207e645..d4a37953246b04752d8422902f3a780e5b9da334 100644 (file)
@@ -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
index 04fb09804a97c2474249f4e74db2340c633462d0..008475bd401e70c0834e9a4fe45016f85fa539b6 100644 (file)
@@ -1,3 +1,12 @@
+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
diff --git a/gas/testsuite/gas/tic6x/resource-func-unit-1.d b/gas/testsuite/gas/tic6x/resource-func-unit-1.d
new file mode 100644 (file)
index 0000000..1543233
--- /dev/null
@@ -0,0 +1,2 @@
+#name: C6X parallel instructions on same functional unit
+#error-output: resource-func-unit-1.l
diff --git a/gas/testsuite/gas/tic6x/resource-func-unit-1.l b/gas/testsuite/gas/tic6x/resource-func-unit-1.l
new file mode 100644 (file)
index 0000000..54d7bce
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+[^:]*:9: Error: functional unit already used in this execute packet
diff --git a/gas/testsuite/gas/tic6x/resource-func-unit-1.s b/gas/testsuite/gas/tic6x/resource-func-unit-1.s
new file mode 100644 (file)
index 0000000..fac20e7
--- /dev/null
@@ -0,0 +1,9 @@
+# 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
diff --git a/gas/testsuite/gas/tic6x/resource-func-unit-2.d b/gas/testsuite/gas/tic6x/resource-func-unit-2.d
new file mode 100644 (file)
index 0000000..38929f7
--- /dev/null
@@ -0,0 +1,2 @@
+#name: C6X parallel instructions on same functional unit, multiple sections
+#error-output: resource-func-unit-2.l
diff --git a/gas/testsuite/gas/tic6x/resource-func-unit-2.l b/gas/testsuite/gas/tic6x/resource-func-unit-2.l
new file mode 100644 (file)
index 0000000..b576bee
--- /dev/null
@@ -0,0 +1,3 @@
+[^:]*: Assembler messages:
+[^:]*:17: Error: functional unit already used in this execute packet
+[^:]*:19: Error: functional unit already used in this execute packet
diff --git a/gas/testsuite/gas/tic6x/resource-func-unit-2.s b/gas/testsuite/gas/tic6x/resource-func-unit-2.s
new file mode 100644 (file)
index 0000000..7406199
--- /dev/null
@@ -0,0 +1,19 @@
+# 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