OSDN Git Service

Fix scheduling abort; stop bits must have selector in range 1..3.
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Mar 2001 11:02:20 +0000 (11:02 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Mar 2001 11:02:20 +0000 (11:02 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40497 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/ia64/ia64.c

index ef29b84..b1f390c 100644 (file)
@@ -1,3 +1,11 @@
+2001-03-15  Bernd Schmidt  <bernds@redhat.com>
+
+       * config/ia64/ia64.c (maybe_rotate): New function, broken out of
+       ia64_sched_reorder.
+       (ia64_sched_reorder): Call maybe_rotate; also rotate after
+       scheduling a stop bit.
+       (ia64_emit_nops): Correctly handle ASMs.
+
 2001-03-15  Mark Mitchell  <mark@codesourcery.com>
 
        * varasm.c (assemble_variable): Use DECL_RTL_SET_P.
index fb8a584..03f977a 100644 (file)
@@ -5650,6 +5650,20 @@ schedule_stop (dump)
     dump_current_packet (dump);
 }
 
+/* If necessary, perform one or two rotations on the scheduling state.  
+   This should only be called if we are starting a new cycle.  */
+
+static void
+maybe_rotate (dump)
+     FILE *dump;
+{
+  if (sched_data.cur == 6)
+    rotate_two_bundles (dump);
+  else if (sched_data.cur >= 3)
+    rotate_one_bundle (dump);
+  sched_data.first_slot = sched_data.cur;
+}
+
 /* We are about to being issuing insns for this clock cycle.
    Override the default sort algorithm to better slot instructions.  */
 
@@ -5673,13 +5687,7 @@ ia64_sched_reorder (dump, sched_verbose, ready, pn_ready, reorder_type)
     }
 
   if (reorder_type == 0)
-    {
-      if (sched_data.cur == 6)
-       rotate_two_bundles (sched_verbose ? dump : NULL);
-      else if (sched_data.cur >= 3)
-       rotate_one_bundle (sched_verbose ? dump : NULL);
-      sched_data.first_slot = sched_data.cur;
-    }
+    maybe_rotate (sched_verbose ? dump : NULL);
 
   /* First, move all USEs, CLOBBERs and other crud out of the way.  */
   highest = ready[n_ready - 1];
@@ -5697,12 +5705,17 @@ ia64_sched_reorder (dump, sched_verbose, ready, pn_ready, reorder_type)
              {
                schedule_stop (sched_verbose ? dump : NULL);
                sched_data.last_was_stop = 1;
+               maybe_rotate (sched_verbose ? dump : NULL);
+               if (dump)
+                 fprintf (dump, "// UNKNOWN insn; group barrier needed.\n");
              }
            else if (GET_CODE (PATTERN (insn)) == ASM_INPUT
                     || asm_noperands (PATTERN (insn)) >= 0)
              {
                /* It must be an asm of some kind.  */
                cycle_end_fill_slots (sched_verbose ? dump : NULL);
+               if (dump)
+                 fprintf (dump, "// UNKNOWN (asm).\n");
              }
            return 1;
          }
@@ -5728,6 +5741,7 @@ ia64_sched_reorder (dump, sched_verbose, ready, pn_ready, reorder_type)
        {
          schedule_stop (sched_verbose ? dump : NULL);
          sched_data.last_was_stop = 1;
+         maybe_rotate (sched_verbose ? dump : NULL);
          if (reorder_type == 1)
            return 0;
        }
@@ -6082,6 +6096,17 @@ ia64_emit_nops ()
       if (b && INSN_P (insn))
        {
          t = ia64_safe_type (insn);
+         if (asm_noperands (PATTERN (insn)) >= 0
+             || GET_CODE (PATTERN (insn)) == ASM_INPUT)
+           {
+             while (bundle_pos < 3)
+               {
+                 emit_insn_before (gen_nop_type (b->t[bundle_pos]), insn);
+                 bundle_pos++;
+               }
+             continue;
+           }
+
          if (t == TYPE_UNKNOWN)
            continue;
          while (bundle_pos < 3)