From: Bernd Schmidt Date: Thu, 15 Mar 2001 11:02:20 +0000 (+0000) Subject: Fix scheduling abort; stop bits must have selector in range 1..3. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e4027dab420f8f741453f3451096356daa167e23;p=gcc.git Fix scheduling abort; stop bits must have selector in range 1..3. From-SVN: r40497 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ef29b846d80..b1f390ccfba 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2001-03-15 Bernd Schmidt + + * 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 * varasm.c (assemble_variable): Use DECL_RTL_SET_P. diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index fb8a5847ec2..03f977a95d4 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -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)