From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jim Wilson To: wilson@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: c/3917 Date: Mon, 17 Sep 2001 22:36:00 -0000 Message-id: <20010918053601.5574.qmail@sourceware.cygnus.com> X-SW-Source: 2001-09/msg00378.html List-Id: The following reply was made to PR c/3917; it has been noted by GNATS. From: Jim Wilson To: gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, gbv@ctv.es, gcc-bugs@gcc.gnu.org, wilson@gcc.gnu.org Cc: Subject: Re: c/3917 Date: Mon, 17 Sep 2001 22:28:53 -0700 I included the patch as a file attachment, and it didn't get included in the mail message. Maybe that wasn't smart, so I am including it again here. Index: ia64.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/ia64/ia64.c,v retrieving revision 1.120 diff -p -r1.120 ia64.c *** ia64.c 2001/08/23 19:27:54 1.120 --- ia64.c 2001/09/14 02:08:41 *************** itanium_split_issue (p, begin) *** 5153,5161 **** enum attr_type t = (t0 == TYPE_L ? TYPE_F : t0 == TYPE_X ? TYPE_I : t0); ! int max = (t == TYPE_B ? 3 : t == TYPE_F ? 1 : 2); if (type_count[t] == max) return i; type_count[t]++; } return split; --- 5153,5165 ---- enum attr_type t = (t0 == TYPE_L ? TYPE_F : t0 == TYPE_X ? TYPE_I : t0); ! ! /* Itanium can execute up to 3 branches, 2 floating point, 2 memory, and! 2 integer per cycle. */ ! int max = (t == TYPE_B ? 3 : 2); if (type_count[t] == max) return i; + type_count[t]++; } return split; *************** insn_matches_slot (p, itype, slot, insn) *** 5347,5353 **** { int i; for (i = sched_data.first_slot; i < slot; i++) ! if (p->t[i] == stype) return 0; } if (GET_CODE (insn) == CALL_INSN) --- 5351,5359 ---- { int i; for (i = sched_data.first_slot; i < slot; i++) ! if (p->t[i] == stype ! || (stype == TYPE_F && p->t[i] == TYPE_L) ! || (stype == TYPE_I && p->t[i] == TYPE_X)) return 0; } if (GET_CODE (insn) == CALL_INSN) *************** cycle_end_fill_slots (dump) *** 5487,5492 **** --- 5493,5504 ---- sched_data.types[slot] = packet->t[slot]; sched_data.insns[slot] = 0; sched_data.stopbit[slot] = 0; + + /* ??? TYPE_L instructions always fill up two slots, but we don't + support TYPE_L nops. */ + if (packet->t[slot] == TYPE_L) + abort (); + slot++; } /* Do _not_ use T here. If T == TYPE_A, then we'd risk changing the *************** cycle_end_fill_slots (dump) *** 5495,5500 **** --- 5507,5515 ---- sched_data.insns[slot] = tmp_insns[i]; sched_data.stopbit[slot] = 0; slot++; + /* TYPE_L instructions always fill up two slots. */ + if (t == TYPE_L) + slot++; } /* This isn't right - there's no need to pad out until the forced split; http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=3917&database=gcc