1132718Skan;; Itanium2 DFA descriptions for insn scheduling and bundling.
2169689Skan;; Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
3132718Skan;; Contributed by Vladimir Makarov <vmakarov@redhat.com>.
4132718Skan;;
5132718Skan;; This file is part of GCC.
6132718Skan;;
7132718Skan;; GCC is free software; you can redistribute it and/or modify
8132718Skan;; it under the terms of the GNU General Public License as published by
9132718Skan;; the Free Software Foundation; either version 2, or (at your option)
10132718Skan;; any later version.
11132718Skan;;
12132718Skan;; GCC is distributed in the hope that it will be useful,
13132718Skan;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14132718Skan;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15132718Skan;; GNU General Public License for more details.
16132718Skan;;
17132718Skan;; You should have received a copy of the GNU General Public License
18132718Skan;; along with GCC; see the file COPYING.  If not, write to
19169689Skan;; the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20169689Skan;; Boston, MA 02110-1301, USA.  */
21132718Skan;;
22132718Skan
23132718Skan/* This is description of pipeline hazards based on DFA.  The
24132718Skan   following constructions can be used for this:
25132718Skan   
26132718Skan   o define_cpu_unit string [string]) describes a cpu functional unit
27132718Skan     (separated by comma).
28132718Skan
29132718Skan     1st operand: Names of cpu function units.
30132718Skan     2nd operand: Name of automaton (see comments for
31132718Skan     DEFINE_AUTOMATON).
32132718Skan
33132718Skan     All define_reservations and define_cpu_units should have unique
34169689Skan     names which cannot be "nothing".
35132718Skan
36132718Skan   o (exclusion_set string string) means that each CPU function unit
37169689Skan     in the first string cannot be reserved simultaneously with each
38132718Skan     unit whose name is in the second string and vise versa.  CPU
39132718Skan     units in the string are separated by commas. For example, it is
40132718Skan     useful for description CPU with fully pipelined floating point
41132718Skan     functional unit which can execute simultaneously only single
42132718Skan     floating point insns or only double floating point insns.
43132718Skan
44132718Skan   o (presence_set string string) means that each CPU function unit in
45169689Skan     the first string cannot be reserved unless at least one of
46132718Skan     pattern of units whose names are in the second string is
47132718Skan     reserved.  This is an asymmetric relation.  CPU units or unit
48132718Skan     patterns in the strings are separated by commas.  Pattern is one
49132718Skan     unit name or unit names separated by white-spaces.
50132718Skan 
51132718Skan     For example, it is useful for description that slot1 is reserved
52132718Skan     after slot0 reservation for a VLIW processor.  We could describe
53132718Skan     it by the following construction
54132718Skan
55132718Skan         (presence_set "slot1" "slot0")
56132718Skan
57132718Skan     Or slot1 is reserved only after slot0 and unit b0 reservation.
58132718Skan     In this case we could write
59132718Skan
60132718Skan         (presence_set "slot1" "slot0 b0")
61132718Skan
62132718Skan     All CPU functional units in a set should belong to the same
63132718Skan     automaton.
64132718Skan
65132718Skan   o (final_presence_set string string) is analogous to
66132718Skan     `presence_set'.  The difference between them is when checking is
67132718Skan     done.  When an instruction is issued in given automaton state
68132718Skan     reflecting all current and planned unit reservations, the
69132718Skan     automaton state is changed.  The first state is a source state,
70132718Skan     the second one is a result state.  Checking for `presence_set' is
71132718Skan     done on the source state reservation, checking for
72132718Skan     `final_presence_set' is done on the result reservation.  This
73132718Skan     construction is useful to describe a reservation which is
74132718Skan     actually two subsequent reservations.  For example, if we use
75132718Skan
76132718Skan         (presence_set "slot1" "slot0")
77132718Skan
78132718Skan     the following insn will be never issued (because slot1 requires
79132718Skan     slot0 which is absent in the source state).
80132718Skan
81132718Skan         (define_reservation "insn_and_nop" "slot0 + slot1")
82132718Skan
83132718Skan     but it can be issued if we use analogous `final_presence_set'.
84132718Skan
85132718Skan   o (absence_set string string) means that each CPU function unit in
86132718Skan     the first string can be reserved only if each pattern of units
87132718Skan     whose names are in the second string is not reserved.  This is an
88132718Skan     asymmetric relation (actually exclusion set is analogous to this
89132718Skan     one but it is symmetric).  CPU units or unit patterns in the
90132718Skan     string are separated by commas.  Pattern is one unit name or unit
91132718Skan     names separated by white-spaces.
92132718Skan
93169689Skan     For example, it is useful for description that slot0 cannot be
94132718Skan     reserved after slot1 or slot2 reservation for a VLIW processor.
95132718Skan     We could describe it by the following construction
96132718Skan
97132718Skan        (absence_set "slot2" "slot0, slot1")
98132718Skan
99169689Skan     Or slot2 cannot be reserved if slot0 and unit b0 are reserved or
100132718Skan     slot1 and unit b1 are reserved .  In this case we could write
101132718Skan
102132718Skan        (absence_set "slot2" "slot0 b0, slot1 b1")
103132718Skan
104132718Skan     All CPU functional units in a set should to belong the same
105132718Skan     automaton.
106132718Skan
107132718Skan   o (final_absence_set string string) is analogous to `absence_set' but
108132718Skan     checking is done on the result (state) reservation.  See comments
109132718Skan     for final_presence_set.
110132718Skan
111132718Skan   o (define_bypass number out_insn_names in_insn_names) names bypass with
112132718Skan     given latency (the first number) from insns given by the first
113132718Skan     string (see define_insn_reservation) into insns given by the
114132718Skan     second string.  Insn names in the strings are separated by
115132718Skan     commas.
116132718Skan
117132718Skan   o (define_automaton string) describes names of an automaton
118132718Skan     generated and used for pipeline hazards recognition.  The names
119132718Skan     are separated by comma.  Actually it is possibly to generate the
120132718Skan     single automaton but unfortunately it can be very large.  If we
121132718Skan     use more one automata, the summary size of the automata usually
122132718Skan     is less than the single one.  The automaton name is used in
123132718Skan     define_cpu_unit.  All automata should have unique names.
124132718Skan
125132718Skan   o (automata_option string) describes option for generation of
126132718Skan     automata.  Currently there are the following options:
127132718Skan
128132718Skan     o "no-minimization" which makes no minimization of automata.
129132718Skan       This is only worth to do when we are debugging the description
130132718Skan       and need to look more accurately at reservations of states.
131132718Skan
132132718Skan     o "ndfa" which makes automata with nondetermenistic reservation
133132718Skan        by insns.
134132718Skan
135132718Skan   o (define_reservation string string) names reservation (the first
136132718Skan     string) of cpu functional units (the 2nd string).  Sometimes unit
137132718Skan     reservations for different insns contain common parts.  In such
138132718Skan     case, you describe common part and use one its name (the 1st
139132718Skan     parameter) in regular expression in define_insn_reservation.  All
140132718Skan     define_reservations, define results and define_cpu_units should
141169689Skan     have unique names which cannot be "nothing".
142132718Skan
143132718Skan   o (define_insn_reservation name default_latency condition regexpr)
144132718Skan     describes reservation of cpu functional units (the 3nd operand)
145132718Skan     for instruction which is selected by the condition (the 2nd
146132718Skan     parameter).  The first parameter is used for output of debugging
147132718Skan     information.  The reservations are described by a regular
148132718Skan     expression according the following syntax:
149132718Skan
150132718Skan       regexp = regexp "," oneof
151132718Skan              | oneof
152132718Skan
153132718Skan       oneof = oneof "|" allof
154132718Skan             | allof
155132718Skan
156132718Skan       allof = allof "+" repeat
157132718Skan             | repeat
158132718Skan 
159132718Skan       repeat = element "*" number
160132718Skan              | element
161132718Skan
162132718Skan       element = cpu_function_name
163132718Skan               | reservation_name
164132718Skan               | result_name
165132718Skan               | "nothing"
166132718Skan               | "(" regexp ")"
167132718Skan
168132718Skan       1. "," is used for describing start of the next cycle in
169132718Skan          reservation.
170132718Skan
171132718Skan       2. "|" is used for describing the reservation described by the
172132718Skan          first regular expression *or* the reservation described by
173132718Skan          the second regular expression *or* etc.
174132718Skan
175132718Skan       3. "+" is used for describing the reservation described by the
176132718Skan          first regular expression *and* the reservation described by
177132718Skan          the second regular expression *and* etc.
178132718Skan
179132718Skan       4. "*" is used for convenience and simply means sequence in
180132718Skan          which the regular expression are repeated NUMBER times with
181132718Skan          cycle advancing (see ",").
182132718Skan
183132718Skan       5. cpu function unit name which means reservation.
184132718Skan
185132718Skan       6. reservation name -- see define_reservation.
186132718Skan
187132718Skan       7. string "nothing" means no units reservation.
188132718Skan
189132718Skan*/
190132718Skan
191132718Skan(define_automaton "two")
192132718Skan
193132718Skan;;   All possible combinations of bundles/syllables
194132718Skan(define_cpu_unit "2_0m.ii, 2_0m.mi, 2_0m.fi, 2_0m.mf, 2_0b.bb, 2_0m.bb,\
195132718Skan                  2_0m.ib, 2_0m.mb, 2_0m.fb, 2_0m.lx" "two")
196132718Skan(define_cpu_unit "2_0mi.i, 2_0mm.i, 2_0mf.i, 2_0mm.f, 2_0bb.b, 2_0mb.b,\
197132718Skan                  2_0mi.b, 2_0mm.b, 2_0mf.b, 2_0mlx." "two")
198132718Skan(define_cpu_unit "2_0mii., 2_0mmi., 2_0mfi., 2_0mmf., 2_0bbb., 2_0mbb.,\
199132718Skan                  2_0mib., 2_0mmb., 2_0mfb." "two")
200132718Skan
201132718Skan(define_cpu_unit "2_1m.ii, 2_1m.mi, 2_1m.fi, 2_1m.mf, 2_1b.bb, 2_1m.bb,\
202132718Skan                  2_1m.ib, 2_1m.mb, 2_1m.fb, 2_1m.lx" "two")
203132718Skan(define_cpu_unit "2_1mi.i, 2_1mm.i, 2_1mf.i, 2_1mm.f, 2_1bb.b, 2_1mb.b,\
204132718Skan                  2_1mi.b, 2_1mm.b, 2_1mf.b, 2_1mlx." "two")
205132718Skan(define_cpu_unit "2_1mii., 2_1mmi., 2_1mfi., 2_1mmf., 2_1bbb., 2_1mbb.,\
206132718Skan                  2_1mib., 2_1mmb., 2_1mfb." "two")
207132718Skan
208132718Skan;; Slot 1
209132718Skan(exclusion_set "2_0m.ii" "2_0m.mi, 2_0m.fi, 2_0m.mf, 2_0b.bb, 2_0m.bb,\
210132718Skan                          2_0m.ib, 2_0m.mb, 2_0m.fb, 2_0m.lx")
211132718Skan(exclusion_set "2_0m.mi" "2_0m.fi, 2_0m.mf, 2_0b.bb, 2_0m.bb, 2_0m.ib,\
212132718Skan                          2_0m.mb, 2_0m.fb, 2_0m.lx")
213132718Skan(exclusion_set "2_0m.fi" "2_0m.mf, 2_0b.bb, 2_0m.bb, 2_0m.ib, 2_0m.mb,\
214132718Skan                          2_0m.fb, 2_0m.lx")
215132718Skan(exclusion_set "2_0m.mf" "2_0b.bb, 2_0m.bb, 2_0m.ib, 2_0m.mb, 2_0m.fb,\
216132718Skan	                  2_0m.lx")
217132718Skan(exclusion_set "2_0b.bb" "2_0m.bb, 2_0m.ib, 2_0m.mb, 2_0m.fb, 2_0m.lx")
218132718Skan(exclusion_set "2_0m.bb" "2_0m.ib, 2_0m.mb, 2_0m.fb, 2_0m.lx")
219132718Skan(exclusion_set "2_0m.ib" "2_0m.mb, 2_0m.fb, 2_0m.lx")
220132718Skan(exclusion_set "2_0m.mb" "2_0m.fb, 2_0m.lx")
221132718Skan(exclusion_set "2_0m.fb" "2_0m.lx")
222132718Skan
223132718Skan;; Slot 2
224132718Skan(exclusion_set "2_0mi.i" "2_0mm.i, 2_0mf.i, 2_0mm.f, 2_0bb.b, 2_0mb.b,\
225132718Skan                          2_0mi.b, 2_0mm.b, 2_0mf.b, 2_0mlx.")
226132718Skan(exclusion_set "2_0mm.i" "2_0mf.i, 2_0mm.f, 2_0bb.b, 2_0mb.b,\
227132718Skan                          2_0mi.b, 2_0mm.b, 2_0mf.b, 2_0mlx.")
228132718Skan(exclusion_set "2_0mf.i" "2_0mm.f, 2_0bb.b, 2_0mb.b, 2_0mi.b, 2_0mm.b,\
229132718Skan                          2_0mf.b, 2_0mlx.")
230132718Skan(exclusion_set "2_0mm.f" "2_0bb.b, 2_0mb.b, 2_0mi.b, 2_0mm.b, 2_0mf.b,\
231132718Skan                          2_0mlx.")
232132718Skan(exclusion_set "2_0bb.b" "2_0mb.b, 2_0mi.b, 2_0mm.b, 2_0mf.b, 2_0mlx.")
233132718Skan(exclusion_set "2_0mb.b" "2_0mi.b, 2_0mm.b, 2_0mf.b, 2_0mlx.")
234132718Skan(exclusion_set "2_0mi.b" "2_0mm.b, 2_0mf.b, 2_0mlx.")
235132718Skan(exclusion_set "2_0mm.b" "2_0mf.b, 2_0mlx.")
236132718Skan(exclusion_set "2_0mf.b" "2_0mlx.")
237132718Skan
238132718Skan;; Slot 3
239132718Skan(exclusion_set "2_0mii." "2_0mmi., 2_0mfi., 2_0mmf., 2_0bbb., 2_0mbb.,\
240132718Skan                          2_0mib., 2_0mmb., 2_0mfb., 2_0mlx.")
241132718Skan(exclusion_set "2_0mmi." "2_0mfi., 2_0mmf., 2_0bbb., 2_0mbb.,\
242132718Skan                          2_0mib., 2_0mmb., 2_0mfb., 2_0mlx.")
243132718Skan(exclusion_set "2_0mfi." "2_0mmf., 2_0bbb., 2_0mbb., 2_0mib., 2_0mmb.,\
244132718Skan                          2_0mfb., 2_0mlx.")
245132718Skan(exclusion_set "2_0mmf." "2_0bbb., 2_0mbb., 2_0mib., 2_0mmb., 2_0mfb.,\
246132718Skan                          2_0mlx.")
247132718Skan(exclusion_set "2_0bbb." "2_0mbb., 2_0mib., 2_0mmb., 2_0mfb., 2_0mlx.")
248132718Skan(exclusion_set "2_0mbb." "2_0mib., 2_0mmb., 2_0mfb., 2_0mlx.")
249132718Skan(exclusion_set "2_0mib." "2_0mmb., 2_0mfb., 2_0mlx.")
250132718Skan(exclusion_set "2_0mmb." "2_0mfb., 2_0mlx.")
251132718Skan(exclusion_set "2_0mfb." "2_0mlx.")
252132718Skan
253132718Skan;; Slot 4
254132718Skan(exclusion_set "2_1m.ii" "2_1m.mi, 2_1m.fi, 2_1m.mf, 2_1b.bb, 2_1m.bb,\
255132718Skan                          2_1m.ib, 2_1m.mb, 2_1m.fb, 2_1m.lx")
256132718Skan(exclusion_set "2_1m.mi" "2_1m.fi, 2_1m.mf, 2_1b.bb, 2_1m.bb, 2_1m.ib,\
257132718Skan                          2_1m.mb, 2_1m.fb, 2_1m.lx")
258132718Skan(exclusion_set "2_1m.fi" "2_1m.mf, 2_1b.bb, 2_1m.bb, 2_1m.ib, 2_1m.mb,\
259132718Skan                          2_1m.fb, 2_1m.lx")
260132718Skan(exclusion_set "2_1m.mf" "2_1b.bb, 2_1m.bb, 2_1m.ib, 2_1m.mb, 2_1m.fb,\
261132718Skan                          2_1m.lx")
262132718Skan(exclusion_set "2_1b.bb" "2_1m.bb, 2_1m.ib, 2_1m.mb, 2_1m.fb, 2_1m.lx")
263132718Skan(exclusion_set "2_1m.bb" "2_1m.ib, 2_1m.mb, 2_1m.fb, 2_1m.lx")
264132718Skan(exclusion_set "2_1m.ib" "2_1m.mb, 2_1m.fb, 2_1m.lx")
265132718Skan(exclusion_set "2_1m.mb" "2_1m.fb, 2_1m.lx")
266132718Skan(exclusion_set "2_1m.fb" "2_1m.lx")
267132718Skan
268132718Skan;; Slot 5
269132718Skan(exclusion_set "2_1mi.i" "2_1mm.i, 2_1mf.i, 2_1mm.f, 2_1bb.b, 2_1mb.b,\
270132718Skan                          2_1mi.b, 2_1mm.b, 2_1mf.b, 2_1mlx.")
271132718Skan(exclusion_set "2_1mm.i" "2_1mf.i, 2_1mm.f, 2_1bb.b, 2_1mb.b,\
272132718Skan                          2_1mi.b, 2_1mm.b, 2_1mf.b, 2_1mlx.")
273132718Skan(exclusion_set "2_1mf.i" "2_1mm.f, 2_1bb.b, 2_1mb.b, 2_1mi.b, 2_1mm.b,\
274132718Skan                          2_1mf.b, 2_1mlx.")
275132718Skan(exclusion_set "2_1mm.f" "2_1bb.b, 2_1mb.b, 2_1mi.b, 2_1mm.b, 2_1mf.b,\
276132718Skan                          2_1mlx.")
277132718Skan(exclusion_set "2_1bb.b" "2_1mb.b, 2_1mi.b, 2_1mm.b, 2_1mf.b, 2_1mlx.")
278132718Skan(exclusion_set "2_1mb.b" "2_1mi.b, 2_1mm.b, 2_1mf.b, 2_1mlx.")
279132718Skan(exclusion_set "2_1mi.b" "2_1mm.b, 2_1mf.b, 2_1mlx.")
280132718Skan(exclusion_set "2_1mm.b" "2_1mf.b, 2_1mlx.")
281132718Skan(exclusion_set "2_1mf.b" "2_1mlx.")
282132718Skan
283132718Skan;; Slot 6
284132718Skan(exclusion_set "2_1mii." "2_1mmi., 2_1mfi., 2_1mmf., 2_1bbb., 2_1mbb.,\
285132718Skan                          2_1mib., 2_1mmb., 2_1mfb., 2_1mlx.")
286132718Skan(exclusion_set "2_1mmi." "2_1mfi., 2_1mmf., 2_1bbb., 2_1mbb.,\
287132718Skan                          2_1mib., 2_1mmb., 2_1mfb., 2_1mlx.")
288132718Skan(exclusion_set "2_1mfi." "2_1mmf., 2_1bbb., 2_1mbb., 2_1mib., 2_1mmb.,\
289132718Skan                          2_1mfb., 2_1mlx.")
290132718Skan(exclusion_set "2_1mmf." "2_1bbb., 2_1mbb., 2_1mib., 2_1mmb., 2_1mfb.,\
291132718Skan                          2_1mlx.")
292132718Skan(exclusion_set "2_1bbb." "2_1mbb., 2_1mib., 2_1mmb., 2_1mfb., 2_1mlx.")
293132718Skan(exclusion_set "2_1mbb." "2_1mib., 2_1mmb., 2_1mfb., 2_1mlx.")
294132718Skan(exclusion_set "2_1mib." "2_1mmb., 2_1mfb., 2_1mlx.")
295132718Skan(exclusion_set "2_1mmb." "2_1mfb., 2_1mlx.")
296132718Skan(exclusion_set "2_1mfb." "2_1mlx.")
297132718Skan
298132718Skan(final_presence_set "2_0mi.i" "2_0m.ii")
299132718Skan(final_presence_set "2_0mii." "2_0mi.i")
300132718Skan(final_presence_set "2_1mi.i" "2_1m.ii")
301132718Skan(final_presence_set "2_1mii." "2_1mi.i")
302132718Skan
303132718Skan(final_presence_set "2_0mm.i" "2_0m.mi")
304132718Skan(final_presence_set "2_0mmi." "2_0mm.i")
305132718Skan(final_presence_set "2_1mm.i" "2_1m.mi")
306132718Skan(final_presence_set "2_1mmi." "2_1mm.i")
307132718Skan
308132718Skan(final_presence_set "2_0mf.i" "2_0m.fi")
309132718Skan(final_presence_set "2_0mfi." "2_0mf.i")
310132718Skan(final_presence_set "2_1mf.i" "2_1m.fi")
311132718Skan(final_presence_set "2_1mfi." "2_1mf.i")
312132718Skan
313132718Skan(final_presence_set "2_0mm.f" "2_0m.mf")
314132718Skan(final_presence_set "2_0mmf." "2_0mm.f")
315132718Skan(final_presence_set "2_1mm.f" "2_1m.mf")
316132718Skan(final_presence_set "2_1mmf." "2_1mm.f")
317132718Skan
318132718Skan(final_presence_set "2_0bb.b" "2_0b.bb")
319132718Skan(final_presence_set "2_0bbb." "2_0bb.b")
320132718Skan(final_presence_set "2_1bb.b" "2_1b.bb")
321132718Skan(final_presence_set "2_1bbb." "2_1bb.b")
322132718Skan
323132718Skan(final_presence_set "2_0mb.b" "2_0m.bb")
324132718Skan(final_presence_set "2_0mbb." "2_0mb.b")
325132718Skan(final_presence_set "2_1mb.b" "2_1m.bb")
326132718Skan(final_presence_set "2_1mbb." "2_1mb.b")
327132718Skan
328132718Skan(final_presence_set "2_0mi.b" "2_0m.ib")
329132718Skan(final_presence_set "2_0mib." "2_0mi.b")
330132718Skan(final_presence_set "2_1mi.b" "2_1m.ib")
331132718Skan(final_presence_set "2_1mib." "2_1mi.b")
332132718Skan
333132718Skan(final_presence_set "2_0mm.b" "2_0m.mb")
334132718Skan(final_presence_set "2_0mmb." "2_0mm.b")
335132718Skan(final_presence_set "2_1mm.b" "2_1m.mb")
336132718Skan(final_presence_set "2_1mmb." "2_1mm.b")
337132718Skan
338132718Skan(final_presence_set "2_0mf.b" "2_0m.fb")
339132718Skan(final_presence_set "2_0mfb." "2_0mf.b")
340132718Skan(final_presence_set "2_1mf.b" "2_1m.fb")
341132718Skan(final_presence_set "2_1mfb." "2_1mf.b")
342132718Skan
343132718Skan(final_presence_set "2_0mlx." "2_0m.lx")
344132718Skan(final_presence_set "2_1mlx." "2_1m.lx")
345132718Skan
346132718Skan;;   The following reflects the dual issue bundle types table.
347132718Skan;;   We could place all possible combinations here because impossible
348132718Skan;; combinations would go away by the subsequent constrains.
349132718Skan(final_presence_set
350132718Skan   "2_1m.lx"
351132718Skan   "2_0mmi.,2_0mfi.,2_0mmf.,2_0mib.,2_0mmb.,2_0mfb.,2_0mlx.")
352132718Skan(final_presence_set "2_1b.bb" "2_0mii.,2_0mmi.,2_0mfi.,2_0mmf.,2_0mlx.")
353132718Skan(final_presence_set
354132718Skan   "2_1m.ii,2_1m.mi,2_1m.fi,2_1m.mf,2_1m.bb,2_1m.ib,2_1m.mb,2_1m.fb"
355132718Skan   "2_0mii.,2_0mmi.,2_0mfi.,2_0mmf.,2_0mib.,2_0mmb.,2_0mfb.,2_0mlx.")
356132718Skan
357132718Skan;;  Ports/units (nb means nop.b insn issued into given port):
358132718Skan(define_cpu_unit
359132718Skan   "2_um0, 2_um1, 2_um2, 2_um3, 2_ui0, 2_ui1, 2_uf0, 2_uf1,\
360132718Skan    2_ub0, 2_ub1, 2_ub2, 2_unb0, 2_unb1, 2_unb2" "two")
361132718Skan
362132718Skan(exclusion_set "2_ub0" "2_unb0")
363132718Skan(exclusion_set "2_ub1" "2_unb1")
364132718Skan(exclusion_set "2_ub2" "2_unb2")
365132718Skan
366132718Skan;; The following rules are used to decrease number of alternatives.
367132718Skan;; They are consequences of Itanium2 microarchitecture.  They also
368132718Skan;; describe the following rules mentioned in Itanium2
369132718Skan;; microarchitecture: rules mentioned in Itanium2 microarchitecture:
370132718Skan;; o "BBB/MBB: Always splits issue after either of these bundles".
371132718Skan;; o "MIB BBB: Split issue after the first bundle in this pair".
372132718Skan(exclusion_set
373132718Skan   "2_0b.bb,2_0bb.b,2_0bbb.,2_0m.bb,2_0mb.b,2_0mbb."
374132718Skan   "2_1m.ii,2_1m.mi,2_1m.fi,2_1m.mf,2_1b.bb,2_1m.bb,\
375132718Skan    2_1m.ib,2_1m.mb,2_1m.fb,2_1m.lx")
376132718Skan(exclusion_set "2_0m.ib,2_0mi.b,2_0mib." "2_1b.bb")
377132718Skan
378132718Skan;;; "MIB/MFB/MMB: Splits issue after any of these bundles unless the
379132718Skan;;; B-slot contains a nop.b or a brp instruction".
380132718Skan;;;   "The B in an MIB/MFB/MMB bundle disperses to B0 if it is a brp or
381132718Skan;;; nop.b, otherwise it disperses to B2".
382132718Skan(final_absence_set
383132718Skan   "2_1m.ii, 2_1m.mi, 2_1m.fi, 2_1m.mf, 2_1b.bb, 2_1m.bb,\
384132718Skan    2_1m.ib, 2_1m.mb, 2_1m.fb, 2_1m.lx"
385132718Skan   "2_0mib. 2_ub2, 2_0mfb. 2_ub2, 2_0mmb. 2_ub2")
386132718Skan
387132718Skan;; This is necessary to start new processor cycle when we meet stop bit.
388132718Skan(define_cpu_unit "2_stop" "two")
389132718Skan(final_absence_set
390132718Skan   "2_0m.ii,2_0mi.i,2_0mii.,2_0m.mi,2_0mm.i,2_0mmi.,2_0m.fi,2_0mf.i,2_0mfi.,\
391132718Skan    2_0m.mf,2_0mm.f,2_0mmf.,2_0b.bb,2_0bb.b,2_0bbb.,2_0m.bb,2_0mb.b,2_0mbb.,\
392132718Skan    2_0m.ib,2_0mi.b,2_0mib.,2_0m.mb,2_0mm.b,2_0mmb.,2_0m.fb,2_0mf.b,2_0mfb.,\
393132718Skan    2_0m.lx,2_0mlx., \
394132718Skan    2_1m.ii,2_1mi.i,2_1mii.,2_1m.mi,2_1mm.i,2_1mmi.,2_1m.fi,2_1mf.i,2_1mfi.,\
395132718Skan    2_1m.mf,2_1mm.f,2_1mmf.,2_1b.bb,2_1bb.b,2_1bbb.,2_1m.bb,2_1mb.b,2_1mbb.,\
396132718Skan    2_1m.ib,2_1mi.b,2_1mib.,2_1m.mb,2_1mm.b,2_1mmb.,2_1m.fb,2_1mf.b,2_1mfb.,\
397132718Skan    2_1m.lx,2_1mlx."
398132718Skan   "2_stop")
399132718Skan
400132718Skan;;   The issue logic can reorder M slot insns between different subtypes
401169689Skan;; but cannot reorder insn within the same subtypes.  The following
402132718Skan;; constraint is enough to describe this.
403132718Skan(final_presence_set "2_um1" "2_um0")
404132718Skan(final_presence_set "2_um3" "2_um2")
405132718Skan
406132718Skan;;   The insn in the 1st I slot of the two bundle issue group will issue
407132718Skan;; to I0.  The second I slot insn will issue to I1.
408132718Skan(final_presence_set "2_ui1" "2_ui0")
409132718Skan
410132718Skan;;  For exceptions of I insns:
411132718Skan(define_cpu_unit "2_only_ui0" "two")
412132718Skan(final_absence_set "2_only_ui0"  "2_ui1")
413132718Skan
414132718Skan;; Insns
415132718Skan
416132718Skan(define_reservation "2_M0"
417132718Skan  "(2_0m.ii|2_0m.mi|2_0m.fi|2_0m.mf|2_0m.bb|2_0m.ib|2_0m.mb|2_0m.fb|2_0m.lx\
418132718Skan    |2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx\
419132718Skan    |2_0mm.i|2_0mm.f|2_0mm.b|2_1mm.i|2_1mm.f|2_1mm.b)\
420132718Skan   +(2_um0|2_um1|2_um2|2_um3)")
421132718Skan
422132718Skan(define_reservation "2_M1"
423132718Skan  "(2_0mii.+(2_ui0|2_ui1)|2_0mmi.+2_ui0|2_0mfi.+2_ui0|2_0mmf.+2_uf0\
424132718Skan    |2_0mib.+2_unb0|2_0mfb.+2_unb0|2_0mmb.+2_unb0)\
425132718Skan   +(2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx)\
426132718Skan   +(2_um0|2_um1|2_um2|2_um3)")
427132718Skan
428132718Skan(define_reservation "2_M" "2_M0|2_M1")
429132718Skan
430132718Skan(define_reservation "2_M0_only_um0"
431132718Skan  "(2_0m.ii|2_0m.mi|2_0m.fi|2_0m.mf|2_0m.bb|2_0m.ib|2_0m.mb|2_0m.fb|2_0m.lx\
432132718Skan    |2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx\
433132718Skan    |2_0mm.i|2_0mm.f|2_0mm.b|2_1mm.i|2_1mm.f|2_1mm.b)\
434132718Skan   +2_um0")
435132718Skan
436132718Skan(define_reservation "2_M1_only_um0"
437132718Skan  "(2_0mii.+(2_ui0|2_ui1)|2_0mmi.+2_ui0|2_0mfi.+2_ui0|2_0mmf.+2_uf0\
438132718Skan    |2_0mib.+2_unb0|2_0mfb.+2_unb0|2_0mmb.+2_unb0)\
439132718Skan   +(2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx)\
440132718Skan   +2_um0")
441132718Skan
442132718Skan(define_reservation "2_M_only_um0" "2_M0_only_um0|2_M1_only_um0")
443132718Skan
444132718Skan(define_reservation "2_M0_only_um2"
445132718Skan  "(2_0m.ii|2_0m.mi|2_0m.fi|2_0m.mf|2_0m.bb|2_0m.ib|2_0m.mb|2_0m.fb|2_0m.lx\
446132718Skan    |2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx\
447132718Skan    |2_0mm.i|2_0mm.f|2_0mm.b|2_1mm.i|2_1mm.f|2_1mm.b)\
448132718Skan   +2_um2")
449132718Skan
450132718Skan(define_reservation "2_M1_only_um2"
451132718Skan  "(2_0mii.+(2_ui0|2_ui1)|2_0mmi.+2_ui0|2_0mfi.+2_ui0|2_0mmf.+2_uf0\
452132718Skan    |2_0mib.+2_unb0|2_0mfb.+2_unb0|2_0mmb.+2_unb0)\
453132718Skan   +(2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx)\
454132718Skan   +2_um2")
455132718Skan
456132718Skan(define_reservation "2_M_only_um2" "2_M0_only_um2|2_M1_only_um2")
457132718Skan
458132718Skan(define_reservation "2_M0_only_um23"
459132718Skan  "(2_0m.ii|2_0m.mi|2_0m.fi|2_0m.mf|2_0m.bb|2_0m.ib|2_0m.mb|2_0m.fb|2_0m.lx\
460132718Skan    |2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx\
461132718Skan    |2_0mm.i|2_0mm.f|2_0mm.b|2_1mm.i|2_1mm.f|2_1mm.b)\
462132718Skan   +(2_um2|2_um3)")
463132718Skan
464132718Skan(define_reservation "2_M1_only_um23"
465132718Skan  "(2_0mii.+(2_ui0|2_ui1)|2_0mmi.+2_ui0|2_0mfi.+2_ui0|2_0mmf.+2_uf0\
466132718Skan    |2_0mib.+2_unb0|2_0mfb.+2_unb0|2_0mmb.+2_unb0)\
467132718Skan   +(2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx)\
468132718Skan   +(2_um2|2_um3)")
469132718Skan
470132718Skan(define_reservation "2_M_only_um23" "2_M0_only_um23|2_M1_only_um23")
471132718Skan
472132718Skan(define_reservation "2_M0_only_um01"
473132718Skan  "(2_0m.ii|2_0m.mi|2_0m.fi|2_0m.mf|2_0m.bb|2_0m.ib|2_0m.mb|2_0m.fb|2_0m.lx\
474132718Skan    |2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx\
475132718Skan    |2_0mm.i|2_0mm.f|2_0mm.b|2_1mm.i|2_1mm.f|2_1mm.b)\
476132718Skan   +(2_um0|2_um1)")
477132718Skan
478132718Skan(define_reservation "2_M1_only_um01"
479132718Skan  "(2_0mii.+(2_ui0|2_ui1)|2_0mmi.+2_ui0|2_0mfi.+2_ui0|2_0mmf.+2_uf0\
480132718Skan    |2_0mib.+2_unb0|2_0mfb.+2_unb0|2_0mmb.+2_unb0)\
481132718Skan   +(2_1m.ii|2_1m.mi|2_1m.fi|2_1m.mf|2_1m.bb|2_1m.ib|2_1m.mb|2_1m.fb|2_1m.lx)\
482132718Skan   +(2_um0|2_um1)")
483132718Skan
484132718Skan(define_reservation "2_M_only_um01" "2_M0_only_um01|2_M1_only_um01")
485132718Skan
486132718Skan;; I instruction is dispersed to the lowest numbered I unit
487169689Skan;; not already in use.  Remember about possible splitting.
488132718Skan(define_reservation "2_I0"
489132718Skan  "2_0mi.i+2_ui0|2_0mii.+(2_ui0|2_ui1)|2_0mmi.+2_ui0\
490132718Skan   |2_0mfi.+2_ui0|2_0mi.b+2_ui0|(2_1mi.i|2_1mi.b)+(2_ui0|2_ui1)\
491132718Skan   |(2_1mii.|2_1mmi.|2_1mfi.)+(2_ui0|2_ui1)")
492132718Skan
493132718Skan(define_reservation "2_I1"
494132718Skan  "2_0m.ii+(2_um0|2_um1|2_um2|2_um3)+2_0mi.i+2_ui0\
495132718Skan   |2_0mm.i+(2_um0|2_um1|2_um2|2_um3)+2_0mmi.+2_ui0\
496132718Skan   |2_0mf.i+2_uf0+2_0mfi.+2_ui0\
497132718Skan   |2_0m.ib+(2_um0|2_um1|2_um2|2_um3)+2_0mi.b+2_ui0\
498132718Skan   |(2_1m.ii+2_1mi.i|2_1m.ib+2_1mi.b)+(2_um0|2_um1|2_um2|2_um3)+(2_ui0|2_ui1)\
499132718Skan   |2_1mm.i+(2_um0|2_um1|2_um2|2_um3)+2_1mmi.+(2_ui0|2_ui1)\
500132718Skan   |2_1mf.i+2_uf1+2_1mfi.+(2_ui0|2_ui1)")
501132718Skan
502132718Skan(define_reservation "2_I" "2_I0|2_I1")
503132718Skan
504132718Skan;; "An F slot in the 1st bundle disperses to F0".
505132718Skan;; "An F slot in the 2st bundle disperses to F1".
506132718Skan(define_reservation "2_F0"
507132718Skan   "2_0mf.i+2_uf0|2_0mmf.+2_uf0|2_0mf.b+2_uf0\
508132718Skan    |2_1mf.i+2_uf1|2_1mmf.+2_uf1|2_1mf.b+2_uf1")
509132718Skan
510132718Skan(define_reservation "2_F1"
511132718Skan   "(2_0m.fi+2_0mf.i|2_0mm.f+2_0mmf.|2_0m.fb+2_0mf.b)\
512132718Skan    +(2_um0|2_um1|2_um2|2_um3)+2_uf0\
513132718Skan    |(2_1m.fi+2_1mf.i|2_1mm.f+2_1mmf.|2_1m.fb+2_1mf.b)\
514132718Skan     +(2_um0|2_um1|2_um2|2_um3)+2_uf1")
515132718Skan
516132718Skan(define_reservation "2_F2"
517132718Skan   "(2_0m.mf+2_0mm.f+2_0mmf.+2_uf0|2_1m.mf+2_1mm.f+2_1mmf.+2_uf1)\
518132718Skan    +(2_um0|2_um1|2_um2|2_um3)+(2_um0|2_um1|2_um2|2_um3)\
519132718Skan    |(2_0mii.+(2_ui0|2_ui1)|2_0mmi.+2_ui0|2_0mfi.+2_ui0\
520132718Skan      |2_0mmf.+(2_um0|2_um1|2_um2|2_um3)\
521132718Skan      |2_0mib.+2_unb0|2_0mmb.+2_unb0|2_0mfb.+2_unb0)\
522132718Skan     +(2_1m.fi+2_1mf.i|2_1m.fb+2_1mf.b)+(2_um0|2_um1|2_um2|2_um3)+2_uf1")
523132718Skan
524132718Skan(define_reservation "2_F" "2_F0|2_F1|2_F2")
525132718Skan
526132718Skan;;; "Each B slot in MBB or BBB bundle disperses to the corresponding B
527132718Skan;;; unit. That is, a B slot in 1st position is dispersed to B0.  In the
528132718Skan;;; 2nd position it is dispersed to B2".
529132718Skan(define_reservation "2_NB"
530132718Skan    "2_0b.bb+2_unb0|2_0bb.b+2_unb1|2_0bbb.+2_unb2\
531132718Skan     |2_0mb.b+2_unb1|2_0mbb.+2_unb2|2_0mib.+2_unb0\
532132718Skan     |2_0mmb.+2_unb0|2_0mfb.+2_unb0\
533132718Skan     |2_1b.bb+2_unb0|2_1bb.b+2_unb1
534132718Skan     |2_1bbb.+2_unb2|2_1mb.b+2_unb1|2_1mbb.+2_unb2\
535132718Skan     |2_1mib.+2_unb0|2_1mmb.+2_unb0|2_1mfb.+2_unb0")
536132718Skan
537132718Skan(define_reservation "2_B0"
538132718Skan   "2_0b.bb+2_ub0|2_0bb.b+2_ub1|2_0bbb.+2_ub2\
539132718Skan    |2_0mb.b+2_ub1|2_0mbb.+2_ub2|2_0mib.+2_ub2\
540132718Skan    |2_0mfb.+2_ub2|2_1b.bb+2_ub0|2_1bb.b+2_ub1\
541132718Skan    |2_1bbb.+2_ub2|2_1mb.b+2_ub1\
542132718Skan    |2_1mib.+2_ub2|2_1mmb.+2_ub2|2_1mfb.+2_ub2")
543132718Skan
544132718Skan(define_reservation "2_B1"
545132718Skan   "2_0m.bb+(2_um0|2_um1|2_um2|2_um3)+2_0mb.b+2_ub1\
546132718Skan    |2_0mi.b+2_ui0+2_0mib.+2_ub2\
547132718Skan    |2_0mm.b+(2_um0|2_um1|2_um2|2_um3)+2_0mmb.+2_ub2\
548132718Skan    |2_0mf.b+2_uf0+2_0mfb.+2_ub2\
549132718Skan    |(2_0mii.+(2_ui0|2_ui1)|2_0mmi.+2_ui0|2_0mfi.+2_ui0|2_0mmf.+2_uf0)\
550132718Skan     +2_1b.bb+2_ub0\
551132718Skan    |2_1m.bb+(2_um0|2_um1|2_um2|2_um3)+2_1mb.b+2_ub1\
552132718Skan    |2_1mi.b+(2_ui0|2_ui1)+2_1mib.+2_ub2\
553132718Skan    |2_1mm.b+(2_um0|2_um1|2_um2|2_um3)+2_1mmb.+2_ub2\
554132718Skan    |2_1mf.b+2_uf1+2_1mfb.+2_ub2")
555132718Skan
556132718Skan(define_reservation "2_B" "2_B0|2_B1")
557132718Skan
558132718Skan;; MLX bunlde uses ports equivalent to MFI bundles.
559132718Skan
560132718Skan;;   For the MLI template, the I slot insn is always assigned to port I0
561132718Skan;; if it is in the first bundle or it is assigned to port I1 if it is in
562132718Skan;; the second bundle.
563132718Skan(define_reservation "2_L0" "2_0mlx.+2_ui0+2_uf0|2_1mlx.+2_ui1+2_uf1")
564132718Skan
565132718Skan(define_reservation "2_L1"
566132718Skan   "2_0m.lx+(2_um0|2_um1|2_um2|2_um3)+2_0mlx.+2_ui0+2_uf0\
567132718Skan   |2_1m.lx+(2_um0|2_um1|2_um2|2_um3)+2_1mlx.+2_ui1+2_uf1")
568132718Skan
569132718Skan(define_reservation "2_L2"
570132718Skan   "(2_0mii.+(2_ui0|2_ui1)|2_0mmi.+2_ui0|2_0mfi.+2_ui0|2_0mmf.+2_uf0\
571132718Skan     |2_0mib.+2_unb0|2_0mmb.+2_unb0|2_0mfb.+2_unb0)
572132718Skan    +2_1m.lx+(2_um0|2_um1|2_um2|2_um3)+2_1mlx.+2_ui1+2_uf1")
573132718Skan
574132718Skan(define_reservation "2_L" "2_L0|2_L1|2_L2")
575132718Skan
576132718Skan;;   Should we describe that A insn in I slot can be issued into M
577132718Skan;; ports?  I think it is not necessary because of multipass
578132718Skan;; scheduling.  For example, the multipass scheduling could use
579132718Skan;; MMI-MMI instead of MII-MII where the two last I slots contain A
580132718Skan;; insns (even if the case is complicated by use-def conflicts).
581132718Skan;;
582132718Skan;; In any case we could describe it as
583132718Skan;;    (define_cpu_unit "2_ui1_0pres,2_ui1_1pres,2_ui1_2pres,2_ui1_3pres" "two")
584132718Skan;;    (final_presence_set "2_ui1_0pres,2_ui1_1pres,2_ui1_2pres,2_ui1_3pres"
585132718Skan;;                        "2_ui1")
586132718Skan;;    (define_reservation "b_A"
587132718Skan;;       "b_M|b_I\
588132718Skan;;        |(2_1mi.i|2_1mii.|2_1mmi.|2_1mfi.|2_1mi.b)+(2_um0|2_um1|2_um2|2_um3)\
589132718Skan;;         +(2_ui1_0pres|2_ui1_1pres|2_ui1_2pres|2_ui1_3pres)")
590132718Skan
591132718Skan(define_reservation "2_A" "2_M|2_I")
592132718Skan
593132718Skan;; We assume that there is no insn issued on the same cycle as the
594132718Skan;; unknown insn.
595132718Skan(define_cpu_unit "2_empty" "two")
596132718Skan(exclusion_set "2_empty"
597132718Skan    "2_0m.ii,2_0m.mi,2_0m.fi,2_0m.mf,2_0b.bb,2_0m.bb,2_0m.ib,2_0m.mb,2_0m.fb,\
598132718Skan     2_0m.lx")
599132718Skan
600132718Skan(define_cpu_unit
601132718Skan   "2_0m_bs, 2_0mi_bs, 2_0mm_bs, 2_0mf_bs, 2_0b_bs, 2_0bb_bs, 2_0mb_bs"
602132718Skan   "two")
603132718Skan(define_cpu_unit
604132718Skan   "2_1m_bs, 2_1mi_bs, 2_1mm_bs, 2_1mf_bs, 2_1b_bs, 2_1bb_bs, 2_1mb_bs"
605132718Skan   "two")
606132718Skan
607132718Skan(define_cpu_unit "2_m_cont, 2_mi_cont, 2_mm_cont, 2_mf_cont, 2_mb_cont,\
608132718Skan	          2_b_cont, 2_bb_cont" "two")
609132718Skan
610132718Skan;; For stop in the middle of the bundles.
611132718Skan(define_cpu_unit "2_m_stop, 2_m0_stop, 2_m1_stop, 2_0mmi_cont" "two")
612132718Skan(define_cpu_unit "2_mi_stop, 2_mi0_stop, 2_mi1_stop, 2_0mii_cont" "two")
613132718Skan
614132718Skan(final_presence_set "2_0m_bs"
615132718Skan   "2_0m.ii, 2_0m.mi, 2_0m.mf, 2_0m.fi, 2_0m.bb,\
616132718Skan    2_0m.ib, 2_0m.fb, 2_0m.mb, 2_0m.lx")
617132718Skan(final_presence_set "2_1m_bs"
618132718Skan   "2_1m.ii, 2_1m.mi, 2_1m.mf, 2_1m.fi, 2_1m.bb,\
619132718Skan    2_1m.ib, 2_1m.fb, 2_1m.mb, 2_1m.lx")
620132718Skan(final_presence_set "2_0mi_bs"  "2_0mi.i, 2_0mi.i")
621132718Skan(final_presence_set "2_1mi_bs"  "2_1mi.i, 2_1mi.i")
622132718Skan(final_presence_set "2_0mm_bs"  "2_0mm.i, 2_0mm.f, 2_0mm.b")
623132718Skan(final_presence_set "2_1mm_bs"  "2_1mm.i, 2_1mm.f, 2_1mm.b")
624132718Skan(final_presence_set "2_0mf_bs"  "2_0mf.i, 2_0mf.b")
625132718Skan(final_presence_set "2_1mf_bs"  "2_1mf.i, 2_1mf.b")
626132718Skan(final_presence_set "2_0b_bs"  "2_0b.bb")
627132718Skan(final_presence_set "2_1b_bs"  "2_1b.bb")
628132718Skan(final_presence_set "2_0bb_bs"  "2_0bb.b")
629132718Skan(final_presence_set "2_1bb_bs"  "2_1bb.b")
630132718Skan(final_presence_set "2_0mb_bs"  "2_0mb.b")
631132718Skan(final_presence_set "2_1mb_bs"  "2_1mb.b")
632132718Skan
633132718Skan(exclusion_set "2_0m_bs"
634132718Skan   "2_0mi.i, 2_0mm.i, 2_0mm.f, 2_0mf.i, 2_0mb.b,\
635132718Skan    2_0mi.b, 2_0mf.b, 2_0mm.b, 2_0mlx., 2_m0_stop")
636132718Skan(exclusion_set "2_1m_bs"
637132718Skan   "2_1mi.i, 2_1mm.i, 2_1mm.f, 2_1mf.i, 2_1mb.b,\
638132718Skan    2_1mi.b, 2_1mf.b, 2_1mm.b, 2_1mlx., 2_m1_stop")
639132718Skan(exclusion_set "2_0mi_bs"  "2_0mii., 2_0mib., 2_mi0_stop")
640132718Skan(exclusion_set "2_1mi_bs"  "2_1mii., 2_1mib., 2_mi1_stop")
641132718Skan(exclusion_set "2_0mm_bs"  "2_0mmi., 2_0mmf., 2_0mmb.")
642132718Skan(exclusion_set "2_1mm_bs"  "2_1mmi., 2_1mmf., 2_1mmb.")
643132718Skan(exclusion_set "2_0mf_bs"  "2_0mfi., 2_0mfb.")
644132718Skan(exclusion_set "2_1mf_bs"  "2_1mfi., 2_1mfb.")
645132718Skan(exclusion_set "2_0b_bs"  "2_0bb.b")
646132718Skan(exclusion_set "2_1b_bs"  "2_1bb.b")
647132718Skan(exclusion_set "2_0bb_bs"  "2_0bbb.")
648132718Skan(exclusion_set "2_1bb_bs"  "2_1bbb.")
649132718Skan(exclusion_set "2_0mb_bs"  "2_0mbb.")
650132718Skan(exclusion_set "2_1mb_bs"  "2_1mbb.")
651132718Skan
652132718Skan(exclusion_set
653132718Skan   "2_0m_bs, 2_0mi_bs, 2_0mm_bs, 2_0mf_bs, 2_0b_bs, 2_0bb_bs, 2_0mb_bs,
654132718Skan    2_1m_bs, 2_1mi_bs, 2_1mm_bs, 2_1mf_bs, 2_1b_bs, 2_1bb_bs, 2_1mb_bs"
655132718Skan   "2_stop")
656132718Skan
657132718Skan(final_presence_set
658132718Skan   "2_0mi.i, 2_0mm.i, 2_0mf.i, 2_0mm.f, 2_0mb.b,\
659132718Skan    2_0mi.b, 2_0mm.b, 2_0mf.b, 2_0mlx."
660132718Skan   "2_m_cont")
661132718Skan(final_presence_set "2_0mii., 2_0mib." "2_mi_cont")
662132718Skan(final_presence_set "2_0mmi., 2_0mmf., 2_0mmb." "2_mm_cont")
663132718Skan(final_presence_set "2_0mfi., 2_0mfb." "2_mf_cont")
664132718Skan(final_presence_set "2_0bb.b" "2_b_cont")
665132718Skan(final_presence_set "2_0bbb." "2_bb_cont")
666132718Skan(final_presence_set "2_0mbb." "2_mb_cont")
667132718Skan
668132718Skan(exclusion_set
669132718Skan   "2_0m.ii, 2_0m.mi, 2_0m.fi, 2_0m.mf, 2_0b.bb, 2_0m.bb,\
670132718Skan    2_0m.ib, 2_0m.mb, 2_0m.fb, 2_0m.lx"
671132718Skan   "2_m_cont, 2_mi_cont, 2_mm_cont, 2_mf_cont,\
672132718Skan    2_mb_cont, 2_b_cont, 2_bb_cont")
673132718Skan
674132718Skan(exclusion_set "2_empty"
675132718Skan               "2_m_cont,2_mi_cont,2_mm_cont,2_mf_cont,\
676132718Skan                2_mb_cont,2_b_cont,2_bb_cont")
677132718Skan
678132718Skan;; For m;mi bundle
679132718Skan(final_presence_set "2_m0_stop" "2_0m.mi")
680132718Skan(final_presence_set "2_0mm.i" "2_0mmi_cont")
681132718Skan(exclusion_set "2_0mmi_cont"
682132718Skan   "2_0m.ii, 2_0m.mi, 2_0m.fi, 2_0m.mf, 2_0b.bb, 2_0m.bb,\
683132718Skan    2_0m.ib, 2_0m.mb, 2_0m.fb, 2_0m.lx")
684132718Skan(exclusion_set "2_m0_stop" "2_0mm.i")
685132718Skan(final_presence_set "2_m1_stop" "2_1m.mi")
686132718Skan(exclusion_set "2_m1_stop" "2_1mm.i")
687132718Skan(final_presence_set "2_m_stop" "2_m0_stop, 2_m1_stop")
688132718Skan
689132718Skan;; For mi;i bundle
690132718Skan(final_presence_set "2_mi0_stop" "2_0mi.i")
691132718Skan(final_presence_set "2_0mii." "2_0mii_cont")
692132718Skan(exclusion_set "2_0mii_cont"
693132718Skan   "2_0m.ii, 2_0m.mi, 2_0m.fi, 2_0m.mf, 2_0b.bb, 2_0m.bb,\
694132718Skan    2_0m.ib, 2_0m.mb, 2_0m.fb, 2_0m.lx")
695132718Skan(exclusion_set "2_mi0_stop" "2_0mii.")
696132718Skan(final_presence_set "2_mi1_stop" "2_1mi.i")
697132718Skan(exclusion_set "2_mi1_stop" "2_1mii.")
698132718Skan(final_presence_set "2_mi_stop" "2_mi0_stop, 2_mi1_stop")
699132718Skan
700132718Skan(final_absence_set
701132718Skan   "2_0m.ii,2_0mi.i,2_0mii.,2_0m.mi,2_0mm.i,2_0mmi.,2_0m.fi,2_0mf.i,2_0mfi.,\
702132718Skan    2_0m.mf,2_0mm.f,2_0mmf.,2_0b.bb,2_0bb.b,2_0bbb.,2_0m.bb,2_0mb.b,2_0mbb.,\
703132718Skan    2_0m.ib,2_0mi.b,2_0mib.,2_0m.mb,2_0mm.b,2_0mmb.,2_0m.fb,2_0mf.b,2_0mfb.,\
704132718Skan    2_0m.lx,2_0mlx., \
705132718Skan    2_1m.ii,2_1mi.i,2_1mii.,2_1m.mi,2_1mm.i,2_1mmi.,2_1m.fi,2_1mf.i,2_1mfi.,\
706132718Skan    2_1m.mf,2_1mm.f,2_1mmf.,2_1b.bb,2_1bb.b,2_1bbb.,2_1m.bb,2_1mb.b,2_1mbb.,\
707132718Skan    2_1m.ib,2_1mi.b,2_1mib.,2_1m.mb,2_1mm.b,2_1mmb.,2_1m.fb,2_1mf.b,2_1mfb.,\
708132718Skan    2_1m.lx,2_1mlx."
709132718Skan   "2_m0_stop,2_m1_stop,2_mi0_stop,2_mi1_stop")
710132718Skan
711132718Skan(define_insn_reservation "2_stop_bit" 0
712132718Skan  (and (and (eq_attr "cpu" "itanium2")
713132718Skan            (eq_attr "itanium_class" "stop_bit"))
714132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
715132718Skan  "2_stop|2_m0_stop|2_m1_stop|2_mi0_stop|2_mi1_stop")
716132718Skan
717132718Skan(define_insn_reservation "2_br"      0
718132718Skan  (and (and (eq_attr "cpu" "itanium2")
719132718Skan            (eq_attr "itanium_class" "br"))
720132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_B")
721132718Skan(define_insn_reservation "2_scall"   0
722132718Skan  (and (and (eq_attr "cpu" "itanium2")
723132718Skan            (eq_attr "itanium_class" "scall"))
724132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_B")
725132718Skan(define_insn_reservation "2_fcmp"    2
726132718Skan  (and (and (eq_attr "cpu" "itanium2")
727132718Skan            (eq_attr "itanium_class" "fcmp"))
728132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_F")
729132718Skan(define_insn_reservation "2_fcvtfx"  4
730132718Skan  (and (and (eq_attr "cpu" "itanium2")
731132718Skan            (eq_attr "itanium_class" "fcvtfx"))
732132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_F")
733132718Skan(define_insn_reservation "2_fld"     6
734169689Skan  (and (and (and (and (eq_attr "cpu" "itanium2")
735169689Skan                      (eq_attr "itanium_class" "fld"))
736169689Skan                 (eq_attr "data_speculative" "no"))
737169689Skan            (eq_attr "check_load" "no"))
738169689Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
739169689Skan  "2_M")
740169689Skan(define_insn_reservation "2_flda"    6
741169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
742169689Skan                 (eq_attr "itanium_class" "fld"))
743169689Skan            (eq_attr "data_speculative" "yes"))
744169689Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
745169689Skan  "2_M_only_um01")
746169689Skan(define_insn_reservation "2_fldc"    0
747169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
748169689Skan                 (eq_attr "itanium_class" "fld"))
749169689Skan            (eq_attr "check_load" "yes"))
750169689Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
751169689Skan  "2_M_only_um01")
752169689Skan
753169689Skan(define_insn_reservation "2_fldp"    6
754169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
755169689Skan		 (eq_attr "itanium_class" "fldp"))
756169689Skan	    (eq_attr "check_load" "no"))
757169689Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
758169689Skan  "2_M_only_um01")
759169689Skan(define_insn_reservation "2_fldpc"   0
760169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
761169689Skan		 (eq_attr "itanium_class" "fldp"))
762169689Skan	    (eq_attr "check_load" "yes"))
763169689Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
764169689Skan  "2_M_only_um01")
765169689Skan
766132718Skan(define_insn_reservation "2_fmac"    4
767132718Skan  (and (and (eq_attr "cpu" "itanium2")
768132718Skan            (eq_attr "itanium_class" "fmac"))
769132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_F")
770132718Skan(define_insn_reservation "2_fmisc"   4
771132718Skan  (and (and (eq_attr "cpu" "itanium2")
772132718Skan            (eq_attr "itanium_class" "fmisc"))
773132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_F")
774132718Skan
775132718Skan;; There is only one insn `mov = ar.bsp' for frar_i:
776132718Skan;; Latency time ???
777132718Skan(define_insn_reservation "2_frar_i" 13
778132718Skan  (and (and (eq_attr "cpu" "itanium2")
779132718Skan            (eq_attr "itanium_class" "frar_i"))
780132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
781132718Skan  "2_I+2_only_ui0")
782132718Skan;; There is only two insns `mov = ar.unat' or `mov = ar.ccv' for frar_m:
783132718Skan;; Latency time ???
784132718Skan(define_insn_reservation "2_frar_m"  6
785132718Skan  (and (and (eq_attr "cpu" "itanium2")
786132718Skan            (eq_attr "itanium_class" "frar_m"))
787132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
788132718Skan  "2_M_only_um2")
789132718Skan(define_insn_reservation "2_frbr"    2
790132718Skan  (and (and (eq_attr "cpu" "itanium2")
791132718Skan            (eq_attr "itanium_class" "frbr"))
792132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
793132718Skan  "2_I+2_only_ui0")
794132718Skan(define_insn_reservation "2_frfr"    5
795132718Skan  (and (and (eq_attr "cpu" "itanium2")
796132718Skan            (eq_attr "itanium_class" "frfr"))
797132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
798132718Skan  "2_M_only_um2")
799132718Skan(define_insn_reservation "2_frpr"    2
800132718Skan  (and (and (eq_attr "cpu" "itanium2")
801132718Skan            (eq_attr "itanium_class" "frpr"))
802132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
803132718Skan  "2_I+2_only_ui0")
804132718Skan
805132718Skan(define_insn_reservation "2_ialu"      1
806132718Skan    (and (and (eq_attr "cpu" "itanium2")
807132718Skan              (eq_attr "itanium_class" "ialu"))
808132718Skan         (eq (symbol_ref "bundling_p") (const_int 0)))
809132718Skan    "2_A")
810132718Skan(define_insn_reservation "2_icmp"    1
811132718Skan  (and (and (eq_attr "cpu" "itanium2")
812132718Skan            (eq_attr "itanium_class" "icmp"))
813132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_A")
814132718Skan(define_insn_reservation "2_ilog"    1
815132718Skan  (and (and (eq_attr "cpu" "itanium2")
816132718Skan            (eq_attr "itanium_class" "ilog"))
817132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_A")
818169689Skan(define_insn_reservation "2_mmalua"  2
819169689Skan  (and (and (eq_attr "cpu" "itanium2")
820169689Skan            (eq_attr "itanium_class" "mmalua"))
821169689Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_A")
822132718Skan;; Latency time ???
823132718Skan(define_insn_reservation "2_ishf"    1
824132718Skan  (and (and (eq_attr "cpu" "itanium2")
825132718Skan            (eq_attr "itanium_class" "ishf"))
826132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
827132718Skan  "2_I+2_only_ui0")
828169689Skan
829132718Skan(define_insn_reservation "2_ld"      1
830169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
831169689Skan                 (eq_attr "itanium_class" "ld"))
832169689Skan            (eq_attr "check_load" "no"))
833169689Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
834169689Skan  "2_M_only_um01")
835169689Skan(define_insn_reservation "2_ldc"     0
836132718Skan  (and (and (eq_attr "cpu" "itanium2")
837169689Skan            (eq_attr "check_load" "yes"))
838132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
839132718Skan  "2_M_only_um01")
840169689Skan
841132718Skan(define_insn_reservation "2_long_i"  1
842132718Skan  (and (and (eq_attr "cpu" "itanium2")
843132718Skan            (eq_attr "itanium_class" "long_i"))
844132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_L")
845132718Skan
846132718Skan(define_insn_reservation "2_mmmul"   2
847132718Skan  (and (and (eq_attr "cpu" "itanium2")
848132718Skan            (eq_attr "itanium_class" "mmmul"))
849132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
850132718Skan  "2_I+2_only_ui0")
851132718Skan;; Latency time ???
852132718Skan(define_insn_reservation "2_mmshf"   2
853132718Skan  (and (and (eq_attr "cpu" "itanium2")
854132718Skan            (eq_attr "itanium_class" "mmshf"))
855132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_I")
856132718Skan;; Latency time ???
857132718Skan(define_insn_reservation "2_mmshfi"  1
858132718Skan  (and (and (eq_attr "cpu" "itanium2")
859132718Skan            (eq_attr "itanium_class" "mmshfi"))
860132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_I")
861132718Skan
862132718Skan;; Now we have only one insn (flushrs) of such class.  We assume that flushrs
863132718Skan;; is the 1st syllable of the bundle after stop bit.
864132718Skan(define_insn_reservation "2_rse_m"   0
865132718Skan  (and (and (eq_attr "cpu" "itanium2")
866132718Skan            (eq_attr "itanium_class" "rse_m"))
867132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
868132718Skan  "(2_0m.ii|2_0m.mi|2_0m.fi|2_0m.mf|2_0m.bb\
869132718Skan    |2_0m.ib|2_0m.mb|2_0m.fb|2_0m.lx)+2_um0")
870132718Skan(define_insn_reservation "2_sem"     0
871132718Skan  (and (and (eq_attr "cpu" "itanium2")
872132718Skan            (eq_attr "itanium_class" "sem"))
873132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
874132718Skan  "2_M_only_um23")
875132718Skan
876132718Skan(define_insn_reservation "2_stf"     1
877132718Skan  (and (and (eq_attr "cpu" "itanium2")
878132718Skan            (eq_attr "itanium_class" "stf"))
879132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
880132718Skan  "2_M_only_um23")
881132718Skan(define_insn_reservation "2_st"      1
882132718Skan  (and (and (eq_attr "cpu" "itanium2")
883132718Skan            (eq_attr "itanium_class" "st"))
884132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
885132718Skan  "2_M_only_um23")
886132718Skan(define_insn_reservation "2_syst_m0" 0
887132718Skan  (and (and (eq_attr "cpu" "itanium2")
888132718Skan            (eq_attr "itanium_class" "syst_m0"))
889132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
890132718Skan  "2_M_only_um2")
891132718Skan(define_insn_reservation "2_syst_m"  0
892132718Skan  (and (and (eq_attr "cpu" "itanium2")
893132718Skan            (eq_attr "itanium_class" "syst_m"))
894132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
895132718Skan  "2_M_only_um0")
896132718Skan;; Reservation???
897132718Skan(define_insn_reservation "2_tbit"    1
898132718Skan  (and (and (eq_attr "cpu" "itanium2")
899132718Skan            (eq_attr "itanium_class" "tbit"))
900132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
901132718Skan  "2_I+2_only_ui0")
902132718Skan
903132718Skan;; There is only ony insn `mov ar.pfs =' for toar_i:
904132718Skan(define_insn_reservation "2_toar_i"  0
905132718Skan  (and (and (eq_attr "cpu" "itanium2")
906132718Skan            (eq_attr "itanium_class" "toar_i"))
907132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
908132718Skan  "2_I+2_only_ui0")
909132718Skan;; There are only ony 2 insns `mov ar.ccv =' and `mov ar.unat =' for toar_m:
910132718Skan;; Latency time ???
911132718Skan(define_insn_reservation "2_toar_m"  5
912132718Skan  (and (and (eq_attr "cpu" "itanium2")
913132718Skan            (eq_attr "itanium_class" "toar_m"))
914132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
915132718Skan  "2_M_only_um2")
916132718Skan;; Latency time ???
917132718Skan(define_insn_reservation "2_tobr"    1
918132718Skan  (and (and (eq_attr "cpu" "itanium2")
919132718Skan            (eq_attr "itanium_class" "tobr"))
920132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
921132718Skan  "2_I+2_only_ui0")
922132718Skan(define_insn_reservation "2_tofr"    5
923132718Skan  (and (and (eq_attr "cpu" "itanium2")
924132718Skan            (eq_attr "itanium_class" "tofr"))
925132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
926132718Skan  "2_M_only_um23")
927132718Skan;; Latency time ???
928132718Skan(define_insn_reservation "2_topr"    1
929132718Skan  (and (and (eq_attr "cpu" "itanium2")
930132718Skan            (eq_attr "itanium_class" "topr"))
931132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
932132718Skan  "2_I+2_only_ui0")
933132718Skan
934132718Skan(define_insn_reservation "2_xmpy"    4
935132718Skan  (and (and (eq_attr "cpu" "itanium2")
936132718Skan            (eq_attr "itanium_class" "xmpy"))
937132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_F")
938132718Skan;; Latency time ???
939132718Skan(define_insn_reservation "2_xtd"     1
940132718Skan  (and (and (eq_attr "cpu" "itanium2")
941132718Skan            (eq_attr "itanium_class" "xtd"))
942132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_I")
943132718Skan
944169689Skan(define_insn_reservation "2_chk_s_i" 0
945132718Skan  (and (and (eq_attr "cpu" "itanium2")
946169689Skan            (eq_attr "itanium_class" "chk_s_i"))
947132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
948132718Skan  "2_I|2_M_only_um23")
949169689Skan(define_insn_reservation "2_chk_s_f" 0
950169689Skan  (and (and (eq_attr "cpu" "itanium2")
951169689Skan            (eq_attr "itanium_class" "chk_s_f"))
952169689Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
953169689Skan  "2_M_only_um23")
954169689Skan(define_insn_reservation "2_chk_a"   0
955169689Skan  (and (and (eq_attr "cpu" "itanium2")
956169689Skan            (eq_attr "itanium_class" "chk_a"))
957169689Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
958169689Skan  "2_M_only_um01")
959169689Skan
960132718Skan(define_insn_reservation "2_lfetch"  0
961132718Skan  (and (and (eq_attr "cpu" "itanium2")
962132718Skan            (eq_attr "itanium_class" "lfetch"))
963132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
964132718Skan  "2_M_only_um01")
965132718Skan
966132718Skan(define_insn_reservation "2_nop_m"   0
967132718Skan  (and (and (eq_attr "cpu" "itanium2")
968132718Skan            (eq_attr "itanium_class" "nop_m"))
969132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_M0")
970132718Skan(define_insn_reservation "2_nop_b"   0
971132718Skan  (and (and (eq_attr "cpu" "itanium2")
972132718Skan            (eq_attr "itanium_class" "nop_b"))
973132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_NB")
974132718Skan(define_insn_reservation "2_nop_i"   0
975132718Skan  (and (and (eq_attr "cpu" "itanium2")
976132718Skan            (eq_attr "itanium_class" "nop_i"))
977132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_I0")
978132718Skan(define_insn_reservation "2_nop_f"   0
979132718Skan  (and (and (eq_attr "cpu" "itanium2")
980132718Skan            (eq_attr "itanium_class" "nop_f"))
981132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_F0")
982132718Skan(define_insn_reservation "2_nop_x"   0
983132718Skan  (and (and (eq_attr "cpu" "itanium2")
984132718Skan            (eq_attr "itanium_class" "nop_x"))
985132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_L0")
986132718Skan
987132718Skan(define_insn_reservation "2_unknown" 1
988132718Skan  (and (and (eq_attr "cpu" "itanium2")
989132718Skan            (eq_attr "itanium_class" "unknown"))
990132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "2_empty")
991132718Skan
992132718Skan(define_insn_reservation "2_nop" 0
993132718Skan  (and (and (eq_attr "cpu" "itanium2")
994132718Skan            (eq_attr "itanium_class" "nop"))
995132718Skan       (eq (symbol_ref "bundling_p") (const_int 0)))
996132718Skan  "2_M0|2_NB|2_I0|2_F0")
997132718Skan
998132718Skan(define_insn_reservation "2_ignore" 0
999132718Skan  (and (and (eq_attr "cpu" "itanium2")
1000132718Skan            (eq_attr "itanium_class" "ignore"))
1001132718Skan       (eq (symbol_ref "bundling_p") (const_int 0))) "nothing")
1002132718Skan
1003132718Skan(define_cpu_unit "2_m_cont_only, 2_b_cont_only" "two")
1004132718Skan(define_cpu_unit "2_mi_cont_only, 2_mm_cont_only, 2_mf_cont_only" "two")
1005132718Skan(define_cpu_unit "2_mb_cont_only, 2_bb_cont_only" "two")
1006132718Skan
1007132718Skan(final_presence_set "2_m_cont_only" "2_m_cont")
1008132718Skan(exclusion_set "2_m_cont_only"
1009132718Skan  "2_0mi.i, 2_0mm.i, 2_0mf.i, 2_0mm.f, 2_0mb.b,\
1010132718Skan   2_0mi.b, 2_0mm.b, 2_0mf.b, 2_0mlx.")
1011132718Skan
1012132718Skan(final_presence_set "2_b_cont_only" "2_b_cont")
1013132718Skan(exclusion_set "2_b_cont_only"  "2_0bb.b")
1014132718Skan
1015132718Skan(final_presence_set "2_mi_cont_only" "2_mi_cont")
1016132718Skan(exclusion_set "2_mi_cont_only" "2_0mii., 2_0mib.")
1017132718Skan
1018132718Skan(final_presence_set "2_mm_cont_only" "2_mm_cont")
1019132718Skan(exclusion_set "2_mm_cont_only" "2_0mmi., 2_0mmf., 2_0mmb.")
1020132718Skan
1021132718Skan(final_presence_set "2_mf_cont_only" "2_mf_cont")
1022132718Skan(exclusion_set "2_mf_cont_only" "2_0mfi., 2_0mfb.")
1023132718Skan
1024132718Skan(final_presence_set "2_mb_cont_only" "2_mb_cont")
1025132718Skan(exclusion_set "2_mb_cont_only" "2_0mbb.")
1026132718Skan
1027132718Skan(final_presence_set "2_bb_cont_only" "2_bb_cont")
1028132718Skan(exclusion_set "2_bb_cont_only" "2_0bbb.")
1029132718Skan
1030132718Skan(define_insn_reservation "2_pre_cycle" 0
1031132718Skan   (and (and (eq_attr "cpu" "itanium2")
1032132718Skan            (eq_attr "itanium_class" "pre_cycle"))
1033132718Skan        (eq (symbol_ref "bundling_p") (const_int 0)))
1034132718Skan                         "nothing")
1035132718Skan
1036132718Skan;;(define_insn_reservation "2_pre_cycle" 0
1037132718Skan;;   (and (and (eq_attr "cpu" "itanium2")
1038132718Skan;;             (eq_attr "itanium_class" "pre_cycle"))
1039132718Skan;;        (eq (symbol_ref "bundling_p") (const_int 0)))
1040132718Skan;;                         "(2_0m_bs, 2_m_cont)                     \
1041132718Skan;;                          | (2_0mi_bs, (2_mi_cont|nothing))       \
1042132718Skan;;                          | (2_0mm_bs, 2_mm_cont)                 \
1043132718Skan;;                          | (2_0mf_bs, (2_mf_cont|nothing))       \
1044132718Skan;;                          | (2_0b_bs, (2_b_cont|nothing))         \
1045132718Skan;;                          | (2_0bb_bs, (2_bb_cont|nothing))       \
1046132718Skan;;                          | (2_0mb_bs, (2_mb_cont|nothing))       \
1047132718Skan;;                          | (2_1m_bs, 2_m_cont)                   \
1048132718Skan;;                          | (2_1mi_bs, (2_mi_cont|nothing))       \
1049132718Skan;;                          | (2_1mm_bs, 2_mm_cont)                 \
1050132718Skan;;                          | (2_1mf_bs, (2_mf_cont|nothing))       \
1051132718Skan;;                          | (2_1b_bs, (2_b_cont|nothing))         \
1052132718Skan;;                          | (2_1bb_bs, (2_bb_cont|nothing))       \
1053132718Skan;;                          | (2_1mb_bs, (2_mb_cont|nothing))       \
1054132718Skan;;                          | (2_m_cont_only, (2_m_cont|nothing))   \
1055132718Skan;;                          | (2_b_cont_only,  (2_b_cont|nothing))  \
1056132718Skan;;                          | (2_mi_cont_only, (2_mi_cont|nothing)) \
1057132718Skan;;                          | (2_mm_cont_only, (2_mm_cont|nothing)) \
1058132718Skan;;                          | (2_mf_cont_only, (2_mf_cont|nothing)) \
1059132718Skan;;                          | (2_mb_cont_only, (2_mb_cont|nothing)) \
1060132718Skan;;                          | (2_bb_cont_only, (2_bb_cont|nothing)) \
1061132718Skan;;                          | (2_m_stop, (2_0mmi_cont|nothing))     \
1062132718Skan;;                          | (2_mi_stop, (2_0mii_cont|nothing))")
1063132718Skan
1064132718Skan;; Bypasses:
1065132718Skan
1066132718Skan(define_bypass  1 "2_fcmp" "2_br,2_scall")
1067132718Skan(define_bypass  0 "2_icmp" "2_br,2_scall")
1068132718Skan(define_bypass  0 "2_tbit" "2_br,2_scall")
1069132718Skan(define_bypass  2 "2_ld" "2_ld"  "ia64_ld_address_bypass_p")
1070132718Skan(define_bypass  2 "2_ld" "2_st"  "ia64_st_address_bypass_p")
1071169689Skan(define_bypass  2 "2_ld,2_ldc" "2_mmalua,2_mmmul,2_mmshf")
1072169689Skan(define_bypass  3 "2_ilog" "2_mmalua,2_mmmul,2_mmshf")
1073169689Skan(define_bypass  3 "2_ialu" "2_mmalua,2_mmmul,2_mmshf")
1074169689Skan(define_bypass  3 "2_mmalua,2_mmmul,2_mmshf" "2_ialu,2_ilog,2_ishf,2_st,2_ld,2_ldc")
1075132718Skan(define_bypass  6 "2_tofr"  "2_frfr,2_stf")
1076132718Skan(define_bypass  7 "2_fmac"  "2_frfr,2_stf")
1077132718Skan
1078132718Skan;; We don't use here fcmp because scall may be predicated.
1079169689Skan(define_bypass  0 "2_fcvtfx,2_fld,2_flda,2_fldc,2_fmac,2_fmisc,2_frar_i,2_frar_m,\
1080169689Skan                   2_frbr,2_frfr,2_frpr,2_ialu,2_ilog,2_ishf,2_ld,2_ldc,2_long_i,\
1081169689Skan                   2_mmalua,2_mmmul,2_mmshf,2_mmshfi,2_toar_m,2_tofr,\
1082169689Skan		   2_xmpy,2_xtd"
1083132718Skan                  "2_scall")
1084132718Skan
1085169689Skan(define_bypass  0 "2_unknown,2_ignore,2_stop_bit,2_br,2_fcmp,2_fcvtfx,2_fld,2_flda,2_fldc,\
1086132718Skan                   2_fmac,2_fmisc,2_frar_i,2_frar_m,2_frbr,2_frfr,2_frpr,\
1087169689Skan                   2_ialu,2_icmp,2_ilog,2_ishf,2_ld,2_ldc,2_chk_s_i,2_chk_s_f,2_chk_a,2_long_i,\
1088169689Skan		   2_mmalua,2_mmmul,2_mmshf,2_mmshfi,2_nop,2_nop_b,2_nop_f,\
1089132718Skan                   2_nop_i,2_nop_m,2_nop_x,2_rse_m,2_scall,2_sem,2_stf,2_st,\
1090132718Skan                   2_syst_m0,2_syst_m,2_tbit,2_toar_i,2_toar_m,2_tobr,2_tofr,\
1091132718Skan                   2_topr,2_xmpy,2_xtd,2_lfetch" "2_ignore")
1092132718Skan
1093132718Skan
1094132718Skan
1095132718Skan;; Bundling
1096132718Skan
1097132718Skan(define_automaton "twob")
1098132718Skan
1099132718Skan;; Pseudo units for quicker searching for position in two packet window.  */
1100132718Skan(define_query_cpu_unit "2_1,2_2,2_3,2_4,2_5,2_6" "twob")
1101132718Skan
1102132718Skan;;   All possible combinations of bundles/syllables
1103132718Skan(define_cpu_unit
1104132718Skan   "2b_0m.ii, 2b_0m.mi, 2b_0m.fi, 2b_0m.mf, 2b_0b.bb, 2b_0m.bb,\
1105132718Skan    2b_0m.ib, 2b_0m.mb, 2b_0m.fb, 2b_0m.lx" "twob")
1106132718Skan(define_cpu_unit
1107132718Skan   "2b_0mi.i, 2b_0mm.i, 2b_0mf.i, 2b_0mm.f, 2b_0bb.b, 2b_0mb.b,\
1108132718Skan    2b_0mi.b, 2b_0mm.b, 2b_0mf.b" "twob")
1109132718Skan(define_query_cpu_unit
1110132718Skan   "2b_0mii., 2b_0mmi., 2b_0mfi., 2b_0mmf., 2b_0bbb., 2b_0mbb.,\
1111132718Skan    2b_0mib., 2b_0mmb., 2b_0mfb., 2b_0mlx." "twob")
1112132718Skan
1113132718Skan(define_cpu_unit
1114132718Skan   "2b_1m.ii, 2b_1m.mi, 2b_1m.fi, 2b_1m.mf, 2b_1b.bb, 2b_1m.bb,\
1115132718Skan    2b_1m.ib, 2b_1m.mb, 2b_1m.fb, 2b_1m.lx" "twob")
1116132718Skan(define_cpu_unit
1117132718Skan   "2b_1mi.i, 2b_1mm.i, 2b_1mf.i, 2b_1mm.f, 2b_1bb.b, 2b_1mb.b,\
1118132718Skan    2b_1mi.b, 2b_1mm.b, 2b_1mf.b" "twob")
1119132718Skan(define_query_cpu_unit
1120132718Skan   "2b_1mii., 2b_1mmi., 2b_1mfi., 2b_1mmf., 2b_1bbb., 2b_1mbb.,\
1121132718Skan    2b_1mib., 2b_1mmb., 2b_1mfb., 2b_1mlx." "twob")
1122132718Skan
1123132718Skan;; Slot 1
1124132718Skan(exclusion_set "2b_0m.ii"
1125132718Skan   "2b_0m.mi, 2b_0m.fi, 2b_0m.mf, 2b_0b.bb, 2b_0m.bb,\
1126132718Skan    2b_0m.ib, 2b_0m.mb, 2b_0m.fb, 2b_0m.lx")
1127132718Skan(exclusion_set "2b_0m.mi"
1128132718Skan   "2b_0m.fi, 2b_0m.mf, 2b_0b.bb, 2b_0m.bb, 2b_0m.ib,\
1129132718Skan    2b_0m.mb, 2b_0m.fb, 2b_0m.lx")
1130132718Skan(exclusion_set "2b_0m.fi"
1131132718Skan   "2b_0m.mf, 2b_0b.bb, 2b_0m.bb, 2b_0m.ib, 2b_0m.mb, 2b_0m.fb, 2b_0m.lx")
1132132718Skan(exclusion_set "2b_0m.mf"
1133132718Skan   "2b_0b.bb, 2b_0m.bb, 2b_0m.ib, 2b_0m.mb, 2b_0m.fb, 2b_0m.lx")
1134132718Skan(exclusion_set "2b_0b.bb" "2b_0m.bb, 2b_0m.ib, 2b_0m.mb, 2b_0m.fb, 2b_0m.lx")
1135132718Skan(exclusion_set "2b_0m.bb" "2b_0m.ib, 2b_0m.mb, 2b_0m.fb, 2b_0m.lx")
1136132718Skan(exclusion_set "2b_0m.ib" "2b_0m.mb, 2b_0m.fb, 2b_0m.lx")
1137132718Skan(exclusion_set "2b_0m.mb" "2b_0m.fb, 2b_0m.lx")
1138132718Skan(exclusion_set "2b_0m.fb" "2b_0m.lx")
1139132718Skan
1140132718Skan;; Slot 2
1141132718Skan(exclusion_set "2b_0mi.i"
1142132718Skan   "2b_0mm.i, 2b_0mf.i, 2b_0mm.f, 2b_0bb.b, 2b_0mb.b,\
1143132718Skan    2b_0mi.b, 2b_0mm.b, 2b_0mf.b, 2b_0mlx.")
1144132718Skan(exclusion_set "2b_0mm.i"
1145132718Skan   "2b_0mf.i, 2b_0mm.f, 2b_0bb.b, 2b_0mb.b,\
1146132718Skan    2b_0mi.b, 2b_0mm.b, 2b_0mf.b, 2b_0mlx.")
1147132718Skan(exclusion_set "2b_0mf.i"
1148132718Skan   "2b_0mm.f, 2b_0bb.b, 2b_0mb.b, 2b_0mi.b, 2b_0mm.b, 2b_0mf.b, 2b_0mlx.")
1149132718Skan(exclusion_set "2b_0mm.f"
1150132718Skan   "2b_0bb.b, 2b_0mb.b, 2b_0mi.b, 2b_0mm.b, 2b_0mf.b, 2b_0mlx.")
1151132718Skan(exclusion_set "2b_0bb.b" "2b_0mb.b, 2b_0mi.b, 2b_0mm.b, 2b_0mf.b, 2b_0mlx.")
1152132718Skan(exclusion_set "2b_0mb.b" "2b_0mi.b, 2b_0mm.b, 2b_0mf.b, 2b_0mlx.")
1153132718Skan(exclusion_set "2b_0mi.b" "2b_0mm.b, 2b_0mf.b, 2b_0mlx.")
1154132718Skan(exclusion_set "2b_0mm.b" "2b_0mf.b, 2b_0mlx.")
1155132718Skan(exclusion_set "2b_0mf.b" "2b_0mlx.")
1156132718Skan
1157132718Skan;; Slot 3
1158132718Skan(exclusion_set "2b_0mii."
1159132718Skan   "2b_0mmi., 2b_0mfi., 2b_0mmf., 2b_0bbb., 2b_0mbb.,\
1160132718Skan    2b_0mib., 2b_0mmb., 2b_0mfb., 2b_0mlx.")
1161132718Skan(exclusion_set "2b_0mmi."
1162132718Skan   "2b_0mfi., 2b_0mmf., 2b_0bbb., 2b_0mbb.,\
1163132718Skan    2b_0mib., 2b_0mmb., 2b_0mfb., 2b_0mlx.")
1164132718Skan(exclusion_set "2b_0mfi."
1165132718Skan   "2b_0mmf., 2b_0bbb., 2b_0mbb., 2b_0mib., 2b_0mmb., 2b_0mfb., 2b_0mlx.")
1166132718Skan(exclusion_set "2b_0mmf."
1167132718Skan   "2b_0bbb., 2b_0mbb., 2b_0mib., 2b_0mmb., 2b_0mfb., 2b_0mlx.")
1168132718Skan(exclusion_set "2b_0bbb." "2b_0mbb., 2b_0mib., 2b_0mmb., 2b_0mfb., 2b_0mlx.")
1169132718Skan(exclusion_set "2b_0mbb." "2b_0mib., 2b_0mmb., 2b_0mfb., 2b_0mlx.")
1170132718Skan(exclusion_set "2b_0mib." "2b_0mmb., 2b_0mfb., 2b_0mlx.")
1171132718Skan(exclusion_set "2b_0mmb." "2b_0mfb., 2b_0mlx.")
1172132718Skan(exclusion_set "2b_0mfb." "2b_0mlx.")
1173132718Skan
1174132718Skan;; Slot 4
1175132718Skan(exclusion_set "2b_1m.ii"
1176132718Skan   "2b_1m.mi, 2b_1m.fi, 2b_1m.mf, 2b_1b.bb, 2b_1m.bb,\
1177132718Skan    2b_1m.ib, 2b_1m.mb, 2b_1m.fb, 2b_1m.lx")
1178132718Skan(exclusion_set "2b_1m.mi"
1179132718Skan   "2b_1m.fi, 2b_1m.mf, 2b_1b.bb, 2b_1m.bb, 2b_1m.ib,\
1180132718Skan    2b_1m.mb, 2b_1m.fb, 2b_1m.lx")
1181132718Skan(exclusion_set "2b_1m.fi"
1182132718Skan   "2b_1m.mf, 2b_1b.bb, 2b_1m.bb, 2b_1m.ib, 2b_1m.mb, 2b_1m.fb, 2b_1m.lx")
1183132718Skan(exclusion_set "2b_1m.mf"
1184132718Skan   "2b_1b.bb, 2b_1m.bb, 2b_1m.ib, 2b_1m.mb, 2b_1m.fb, 2b_1m.lx")
1185132718Skan(exclusion_set "2b_1b.bb" "2b_1m.bb, 2b_1m.ib, 2b_1m.mb, 2b_1m.fb, 2b_1m.lx")
1186132718Skan(exclusion_set "2b_1m.bb" "2b_1m.ib, 2b_1m.mb, 2b_1m.fb, 2b_1m.lx")
1187132718Skan(exclusion_set "2b_1m.ib" "2b_1m.mb, 2b_1m.fb, 2b_1m.lx")
1188132718Skan(exclusion_set "2b_1m.mb" "2b_1m.fb, 2b_1m.lx")
1189132718Skan(exclusion_set "2b_1m.fb" "2b_1m.lx")
1190132718Skan
1191132718Skan;; Slot 5
1192132718Skan(exclusion_set "2b_1mi.i"
1193132718Skan   "2b_1mm.i, 2b_1mf.i, 2b_1mm.f, 2b_1bb.b, 2b_1mb.b,\
1194132718Skan    2b_1mi.b, 2b_1mm.b, 2b_1mf.b, 2b_1mlx.")
1195132718Skan(exclusion_set "2b_1mm.i"
1196132718Skan   "2b_1mf.i, 2b_1mm.f, 2b_1bb.b, 2b_1mb.b,\
1197132718Skan    2b_1mi.b, 2b_1mm.b, 2b_1mf.b, 2b_1mlx.")
1198132718Skan(exclusion_set "2b_1mf.i"
1199132718Skan   "2b_1mm.f, 2b_1bb.b, 2b_1mb.b, 2b_1mi.b, 2b_1mm.b, 2b_1mf.b, 2b_1mlx.")
1200132718Skan(exclusion_set "2b_1mm.f"
1201132718Skan   "2b_1bb.b, 2b_1mb.b, 2b_1mi.b, 2b_1mm.b, 2b_1mf.b, 2b_1mlx.")
1202132718Skan(exclusion_set "2b_1bb.b" "2b_1mb.b, 2b_1mi.b, 2b_1mm.b, 2b_1mf.b, 2b_1mlx.")
1203132718Skan(exclusion_set "2b_1mb.b" "2b_1mi.b, 2b_1mm.b, 2b_1mf.b, 2b_1mlx.")
1204132718Skan(exclusion_set "2b_1mi.b" "2b_1mm.b, 2b_1mf.b, 2b_1mlx.")
1205132718Skan(exclusion_set "2b_1mm.b" "2b_1mf.b, 2b_1mlx.")
1206132718Skan(exclusion_set "2b_1mf.b" "2b_1mlx.")
1207132718Skan
1208132718Skan;; Slot 6
1209132718Skan(exclusion_set "2b_1mii."
1210132718Skan   "2b_1mmi., 2b_1mfi., 2b_1mmf., 2b_1bbb., 2b_1mbb.,\
1211132718Skan    2b_1mib., 2b_1mmb., 2b_1mfb., 2b_1mlx.")
1212132718Skan(exclusion_set "2b_1mmi."
1213132718Skan   "2b_1mfi., 2b_1mmf., 2b_1bbb., 2b_1mbb.,\
1214132718Skan    2b_1mib., 2b_1mmb., 2b_1mfb., 2b_1mlx.")
1215132718Skan(exclusion_set "2b_1mfi."
1216132718Skan   "2b_1mmf., 2b_1bbb., 2b_1mbb., 2b_1mib., 2b_1mmb., 2b_1mfb., 2b_1mlx.")
1217132718Skan(exclusion_set "2b_1mmf."
1218132718Skan   "2b_1bbb., 2b_1mbb., 2b_1mib., 2b_1mmb., 2b_1mfb., 2b_1mlx.")
1219132718Skan(exclusion_set "2b_1bbb." "2b_1mbb., 2b_1mib., 2b_1mmb., 2b_1mfb., 2b_1mlx.")
1220132718Skan(exclusion_set "2b_1mbb." "2b_1mib., 2b_1mmb., 2b_1mfb., 2b_1mlx.")
1221132718Skan(exclusion_set "2b_1mib." "2b_1mmb., 2b_1mfb., 2b_1mlx.")
1222132718Skan(exclusion_set "2b_1mmb." "2b_1mfb., 2b_1mlx.")
1223132718Skan(exclusion_set "2b_1mfb." "2b_1mlx.")
1224132718Skan
1225132718Skan(final_presence_set "2b_0mi.i" "2b_0m.ii")
1226132718Skan(final_presence_set "2b_0mii." "2b_0mi.i")
1227132718Skan(final_presence_set "2b_1mi.i" "2b_1m.ii")
1228132718Skan(final_presence_set "2b_1mii." "2b_1mi.i")
1229132718Skan
1230132718Skan(final_presence_set "2b_0mm.i" "2b_0m.mi")
1231132718Skan(final_presence_set "2b_0mmi." "2b_0mm.i")
1232132718Skan(final_presence_set "2b_1mm.i" "2b_1m.mi")
1233132718Skan(final_presence_set "2b_1mmi." "2b_1mm.i")
1234132718Skan
1235132718Skan(final_presence_set "2b_0mf.i" "2b_0m.fi")
1236132718Skan(final_presence_set "2b_0mfi." "2b_0mf.i")
1237132718Skan(final_presence_set "2b_1mf.i" "2b_1m.fi")
1238132718Skan(final_presence_set "2b_1mfi." "2b_1mf.i")
1239132718Skan
1240132718Skan(final_presence_set "2b_0mm.f" "2b_0m.mf")
1241132718Skan(final_presence_set "2b_0mmf." "2b_0mm.f")
1242132718Skan(final_presence_set "2b_1mm.f" "2b_1m.mf")
1243132718Skan(final_presence_set "2b_1mmf." "2b_1mm.f")
1244132718Skan
1245132718Skan(final_presence_set "2b_0bb.b" "2b_0b.bb")
1246132718Skan(final_presence_set "2b_0bbb." "2b_0bb.b")
1247132718Skan(final_presence_set "2b_1bb.b" "2b_1b.bb")
1248132718Skan(final_presence_set "2b_1bbb." "2b_1bb.b")
1249132718Skan
1250132718Skan(final_presence_set "2b_0mb.b" "2b_0m.bb")
1251132718Skan(final_presence_set "2b_0mbb." "2b_0mb.b")
1252132718Skan(final_presence_set "2b_1mb.b" "2b_1m.bb")
1253132718Skan(final_presence_set "2b_1mbb." "2b_1mb.b")
1254132718Skan
1255132718Skan(final_presence_set "2b_0mi.b" "2b_0m.ib")
1256132718Skan(final_presence_set "2b_0mib." "2b_0mi.b")
1257132718Skan(final_presence_set "2b_1mi.b" "2b_1m.ib")
1258132718Skan(final_presence_set "2b_1mib." "2b_1mi.b")
1259132718Skan
1260132718Skan(final_presence_set "2b_0mm.b" "2b_0m.mb")
1261132718Skan(final_presence_set "2b_0mmb." "2b_0mm.b")
1262132718Skan(final_presence_set "2b_1mm.b" "2b_1m.mb")
1263132718Skan(final_presence_set "2b_1mmb." "2b_1mm.b")
1264132718Skan
1265132718Skan(final_presence_set "2b_0mf.b" "2b_0m.fb")
1266132718Skan(final_presence_set "2b_0mfb." "2b_0mf.b")
1267132718Skan(final_presence_set "2b_1mf.b" "2b_1m.fb")
1268132718Skan(final_presence_set "2b_1mfb." "2b_1mf.b")
1269132718Skan
1270132718Skan(final_presence_set "2b_0mlx." "2b_0m.lx")
1271132718Skan(final_presence_set "2b_1mlx." "2b_1m.lx")
1272132718Skan
1273132718Skan;;  See the corresponding comment in non-bundling section above.
1274132718Skan(final_presence_set
1275132718Skan   "2b_1m.lx"
1276132718Skan   "2b_0mmi.,2b_0mfi.,2b_0mmf.,2b_0mib.,2b_0mmb.,2b_0mfb.,2b_0mlx.")
1277132718Skan(final_presence_set "2b_1b.bb" "2b_0mii.,2b_0mmi.,2b_0mfi.,2b_0mmf.,2b_0mlx.")
1278132718Skan(final_presence_set
1279132718Skan   "2b_1m.ii,2b_1m.mi,2b_1m.fi,2b_1m.mf,2b_1m.bb,2b_1m.ib,2b_1m.mb,2b_1m.fb"
1280132718Skan   "2b_0mii.,2b_0mmi.,2b_0mfi.,2b_0mmf.,2b_0mib.,2b_0mmb.,2b_0mfb.,2b_0mlx.")
1281132718Skan
1282132718Skan;;  Ports/units (nb means nop.b insn issued into given port):
1283132718Skan(define_cpu_unit
1284132718Skan   "2b_um0, 2b_um1, 2b_um2, 2b_um3, 2b_ui0, 2b_ui1, 2b_uf0, 2b_uf1,\
1285132718Skan    2b_ub0, 2b_ub1, 2b_ub2, 2b_unb0, 2b_unb1, 2b_unb2" "twob")
1286132718Skan
1287132718Skan(exclusion_set "2b_ub0" "2b_unb0")
1288132718Skan(exclusion_set "2b_ub1" "2b_unb1")
1289132718Skan(exclusion_set "2b_ub2" "2b_unb2")
1290132718Skan
1291132718Skan;; The following rules are used to decrease number of alternatives.
1292132718Skan;; They are consequences of Itanium2 microarchitecture.  They also
1293132718Skan;; describe the following rules mentioned in Itanium2
1294132718Skan;; microarchitecture: rules mentioned in Itanium2 microarchitecture:
1295132718Skan;; o "BBB/MBB: Always splits issue after either of these bundles".
1296132718Skan;; o "MIB BBB: Split issue after the first bundle in this pair".
1297132718Skan(exclusion_set
1298132718Skan   "2b_0b.bb,2b_0bb.b,2b_0bbb.,2b_0m.bb,2b_0mb.b,2b_0mbb."
1299132718Skan   "2b_1m.ii,2b_1m.mi,2b_1m.fi,2b_1m.mf,2b_1b.bb,2b_1m.bb,\
1300132718Skan    2b_1m.ib,2b_1m.mb,2b_1m.fb,2b_1m.lx")
1301132718Skan(exclusion_set "2b_0m.ib,2b_0mi.b,2b_0mib." "2b_1b.bb")
1302132718Skan
1303132718Skan;;; "MIB/MFB/MMB: Splits issue after any of these bundles unless the
1304132718Skan;;; B-slot contains a nop.b or a brp instruction".
1305132718Skan;;;   "The B in an MIB/MFB/MMB bundle disperses to B0 if it is a brp or
1306132718Skan;;; nop.b, otherwise it disperses to B2".
1307132718Skan(final_absence_set
1308132718Skan   "2b_1m.ii, 2b_1m.mi, 2b_1m.fi, 2b_1m.mf, 2b_1b.bb, 2b_1m.bb,\
1309132718Skan    2b_1m.ib, 2b_1m.mb, 2b_1m.fb, 2b_1m.lx"
1310132718Skan   "2b_0mib. 2b_ub2, 2b_0mfb. 2b_ub2, 2b_0mmb. 2b_ub2")
1311132718Skan
1312132718Skan;; This is necessary to start new processor cycle when we meet stop bit.
1313132718Skan(define_cpu_unit "2b_stop" "twob")
1314132718Skan(final_absence_set
1315132718Skan   "2b_0m.ii,2b_0mi.i,2b_0mii.,2b_0m.mi,2b_0mm.i,2b_0mmi.,\
1316132718Skan    2b_0m.fi,2b_0mf.i,2b_0mfi.,\
1317132718Skan    2b_0m.mf,2b_0mm.f,2b_0mmf.,2b_0b.bb,2b_0bb.b,2b_0bbb.,\
1318132718Skan    2b_0m.bb,2b_0mb.b,2b_0mbb.,\
1319132718Skan    2b_0m.ib,2b_0mi.b,2b_0mib.,2b_0m.mb,2b_0mm.b,2b_0mmb.,\
1320132718Skan    2b_0m.fb,2b_0mf.b,2b_0mfb.,2b_0m.lx,2b_0mlx., \
1321132718Skan    2b_1m.ii,2b_1mi.i,2b_1mii.,2b_1m.mi,2b_1mm.i,2b_1mmi.,\
1322132718Skan    2b_1m.fi,2b_1mf.i,2b_1mfi.,\
1323132718Skan    2b_1m.mf,2b_1mm.f,2b_1mmf.,2b_1b.bb,2b_1bb.b,2b_1bbb.,\
1324132718Skan    2b_1m.bb,2b_1mb.b,2b_1mbb.,\
1325132718Skan    2b_1m.ib,2b_1mi.b,2b_1mib.,2b_1m.mb,2b_1mm.b,2b_1mmb.,\
1326132718Skan    2b_1m.fb,2b_1mf.b,2b_1mfb.,2b_1m.lx,2b_1mlx."
1327132718Skan   "2b_stop")
1328132718Skan
1329132718Skan;;   The issue logic can reorder M slot insns between different subtypes
1330169689Skan;; but cannot reorder insn within the same subtypes.  The following
1331132718Skan;; constraint is enough to describe this.
1332132718Skan(final_presence_set "2b_um1" "2b_um0")
1333132718Skan(final_presence_set "2b_um3" "2b_um2")
1334132718Skan
1335132718Skan;;   The insn in the 1st I slot of the two bundle issue group will issue
1336132718Skan;; to I0.  The second I slot insn will issue to I1.
1337132718Skan(final_presence_set "2b_ui1" "2b_ui0")
1338132718Skan
1339132718Skan;;  For exceptions of I insns:
1340132718Skan(define_cpu_unit "2b_only_ui0" "twob")
1341132718Skan(final_absence_set "2b_only_ui0"  "2b_ui1")
1342132718Skan
1343132718Skan;; Insns
1344132718Skan
1345132718Skan(define_reservation "2b_M"
1346132718Skan  "((2b_0m.ii|2b_0m.mi|2b_0m.fi|2b_0m.mf|2b_0m.bb\
1347132718Skan     |2b_0m.ib|2b_0m.mb|2b_0m.fb|2b_0m.lx)+2_1\
1348132718Skan    |(2b_1m.ii|2b_1m.mi|2b_1m.fi|2b_1m.mf|2b_1m.bb\
1349132718Skan      |2b_1m.ib|2b_1m.mb|2b_1m.fb|2b_1m.lx)+2_4\
1350132718Skan    |(2b_0mm.i|2b_0mm.f|2b_0mm.b)+2_2\
1351132718Skan    |(2b_1mm.i|2b_1mm.f|2b_1mm.b)+2_5)\
1352132718Skan   +(2b_um0|2b_um1|2b_um2|2b_um3)")
1353132718Skan
1354132718Skan(define_reservation "2b_M_only_um0"
1355132718Skan  "((2b_0m.ii|2b_0m.mi|2b_0m.fi|2b_0m.mf|2b_0m.bb\
1356132718Skan     |2b_0m.ib|2b_0m.mb|2b_0m.fb|2b_0m.lx)+2_1\
1357132718Skan    |(2b_1m.ii|2b_1m.mi|2b_1m.fi|2b_1m.mf|2b_1m.bb\
1358132718Skan      |2b_1m.ib|2b_1m.mb|2b_1m.fb|2b_1m.lx)+2_4\
1359132718Skan    |(2b_0mm.i|2b_0mm.f|2b_0mm.b)+2_2\
1360132718Skan    |(2b_1mm.i|2b_1mm.f|2b_1mm.b)+2_5)\
1361132718Skan   +2b_um0")
1362132718Skan
1363132718Skan(define_reservation "2b_M_only_um2"
1364132718Skan  "((2b_0m.ii|2b_0m.mi|2b_0m.fi|2b_0m.mf|2b_0m.bb\
1365132718Skan     |2b_0m.ib|2b_0m.mb|2b_0m.fb|2b_0m.lx)+2_1\
1366132718Skan    |(2b_1m.ii|2b_1m.mi|2b_1m.fi|2b_1m.mf|2b_1m.bb\
1367132718Skan      |2b_1m.ib|2b_1m.mb|2b_1m.fb|2b_1m.lx)+2_4\
1368132718Skan    |(2b_0mm.i|2b_0mm.f|2b_0mm.b)+2_2\
1369132718Skan    |(2b_1mm.i|2b_1mm.f|2b_1mm.b)+2_5)\
1370132718Skan   +2b_um2")
1371132718Skan
1372132718Skan(define_reservation "2b_M_only_um01"
1373132718Skan  "((2b_0m.ii|2b_0m.mi|2b_0m.fi|2b_0m.mf|2b_0m.bb\
1374132718Skan     |2b_0m.ib|2b_0m.mb|2b_0m.fb|2b_0m.lx)+2_1\
1375132718Skan    |(2b_1m.ii|2b_1m.mi|2b_1m.fi|2b_1m.mf|2b_1m.bb\
1376132718Skan      |2b_1m.ib|2b_1m.mb|2b_1m.fb|2b_1m.lx)+2_4\
1377132718Skan    |(2b_0mm.i|2b_0mm.f|2b_0mm.b)+2_2\
1378132718Skan    |(2b_1mm.i|2b_1mm.f|2b_1mm.b)+2_5)\
1379132718Skan   +(2b_um0|2b_um1)")
1380132718Skan
1381132718Skan(define_reservation "2b_M_only_um23"
1382132718Skan  "((2b_0m.ii|2b_0m.mi|2b_0m.fi|2b_0m.mf|2b_0m.bb\
1383132718Skan     |2b_0m.ib|2b_0m.mb|2b_0m.fb|2b_0m.lx)+2_1\
1384132718Skan    |(2b_1m.ii|2b_1m.mi|2b_1m.fi|2b_1m.mf|2b_1m.bb\
1385132718Skan      |2b_1m.ib|2b_1m.mb|2b_1m.fb|2b_1m.lx)+2_4\
1386132718Skan    |(2b_0mm.i|2b_0mm.f|2b_0mm.b)+2_2\
1387132718Skan    |(2b_1mm.i|2b_1mm.f|2b_1mm.b)+2_5)\
1388132718Skan   +(2b_um2|2b_um3)")
1389132718Skan
1390132718Skan;; I instruction is dispersed to the lowest numbered I unit
1391169689Skan;; not already in use.  Remember about possible splitting.
1392132718Skan(define_reservation "2b_I"
1393132718Skan  "2b_0mi.i+2_2+2b_ui0|2b_0mii.+2_3+(2b_ui0|2b_ui1)|2b_0mmi.+2_3+2b_ui0\
1394132718Skan   |2b_0mfi.+2_3+2b_ui0|2b_0mi.b+2_2+2b_ui0\
1395132718Skan   |(2b_1mi.i+2_5|2b_1mi.b+2_5)+(2b_ui0|2b_ui1)\
1396132718Skan   |(2b_1mii.|2b_1mmi.|2b_1mfi.)+2_6+(2b_ui0|2b_ui1)")
1397132718Skan
1398132718Skan;; "An F slot in the 1st bundle disperses to F0".
1399132718Skan;; "An F slot in the 2st bundle disperses to F1".
1400132718Skan(define_reservation "2b_F"
1401132718Skan   "2b_0mf.i+2_2+2b_uf0|2b_0mmf.+2_3+2b_uf0|2b_0mf.b+2_2+2b_uf0\
1402132718Skan    |2b_1mf.i+2_5+2b_uf1|2b_1mmf.+2_6+2b_uf1|2b_1mf.b+2_5+2b_uf1")
1403132718Skan
1404132718Skan;;; "Each B slot in MBB or BBB bundle disperses to the corresponding B
1405132718Skan;;; unit. That is, a B slot in 1st position is dispersed to B0.  In the
1406132718Skan;;; 2nd position it is dispersed to B2".
1407132718Skan(define_reservation "2b_NB"
1408132718Skan    "2b_0b.bb+2_1+2b_unb0|2b_0bb.b+2_2+2b_unb1|2b_0bbb.+2_3+2b_unb2\
1409132718Skan     |2b_0mb.b+2_2+2b_unb1|2b_0mbb.+2_3+2b_unb2\
1410132718Skan     |2b_0mib.+2_3+2b_unb0|2b_0mmb.+2_3+2b_unb0|2b_0mfb.+2_3+2b_unb0\
1411132718Skan     |2b_1b.bb+2_4+2b_unb0|2b_1bb.b+2_5+2b_unb1\
1412132718Skan     |2b_1bbb.+2_6+2b_unb2|2b_1mb.b+2_5+2b_unb1|2b_1mbb.+2_6+2b_unb2\
1413132718Skan     |2b_1mib.+2_6+2b_unb0|2b_1mmb.+2_6+2b_unb0|2b_1mfb.+2_6+2b_unb0")
1414132718Skan
1415132718Skan(define_reservation "2b_B"
1416132718Skan   "2b_0b.bb+2_1+2b_ub0|2b_0bb.b+2_2+2b_ub1|2b_0bbb.+2_3+2b_ub2\
1417132718Skan    |2b_0mb.b+2_2+2b_ub1|2b_0mbb.+2_3+2b_ub2|2b_0mib.+2_3+2b_ub2\
1418132718Skan    |2b_0mfb.+2_3+2b_ub2|2b_1b.bb+2_4+2b_ub0|2b_1bb.b+2_5+2b_ub1\
1419132718Skan    |2b_1bbb.+2_6+2b_ub2|2b_1mb.b+2_5+2b_ub1\
1420132718Skan    |2b_1mib.+2_6+2b_ub2|2b_1mmb.+2_6+2b_ub2|2b_1mfb.+2_6+2b_ub2")
1421132718Skan
1422132718Skan;;   For the MLI template, the I slot insn is always assigned to port I0
1423132718Skan;; if it is in the first bundle or it is assigned to port I1 if it is in
1424132718Skan;; the second bundle.
1425132718Skan(define_reservation "2b_L"
1426132718Skan                    "2b_0mlx.+2_3+2b_ui0+2b_uf0|2b_1mlx.+2_6+2b_ui1+2b_uf1")
1427132718Skan
1428132718Skan;;   Should we describe that A insn in I slot can be issued into M
1429132718Skan;; ports?  I think it is not necessary because of multipass
1430132718Skan;; scheduling.  For example, the multipass scheduling could use
1431132718Skan;; MMI-MMI instead of MII-MII where the two last I slots contain A
1432132718Skan;; insns (even if the case is complicated by use-def conflicts).
1433132718Skan;;
1434132718Skan;; In any case we could describe it as
1435132718Skan;;    (define_cpu_unit "2b_ui1_0pres,2b_ui1_1pres,2b_ui1_2pres,2b_ui1_3pres"
1436132718Skan;;                     "twob")
1437132718Skan;;    (final_presence_set "2b_ui1_0pres,2b_ui1_1pres,2b_ui1_2pres,2b_ui1_3pres"
1438132718Skan;;                        "2b_ui1")
1439132718Skan;;    (define_reservation "b_A"
1440132718Skan;;       "b_M|b_I\
1441132718Skan;;        |(2b_1mi.i+2_5|2b_1mii.+2_6|2b_1mmi.+2_6|2b_1mfi.+2_6|2b_1mi.b+2_5)\
1442132718Skan;;         +(2b_um0|2b_um1|2b_um2|2b_um3)\
1443132718Skan;;         +(2b_ui1_0pres|2b_ui1_1pres|2b_ui1_2pres|2b_ui1_3pres)")
1444132718Skan
1445132718Skan(define_reservation "2b_A" "2b_M|2b_I")
1446132718Skan
1447132718Skan;; We assume that there is no insn issued on the same cycle as the
1448132718Skan;; unknown insn.
1449132718Skan(define_cpu_unit "2b_empty" "twob")
1450132718Skan(exclusion_set "2b_empty"
1451132718Skan    "2b_0m.ii,2b_0m.mi,2b_0m.fi,2b_0m.mf,2b_0b.bb,2b_0m.bb,\
1452132718Skan     2b_0m.ib,2b_0m.mb,2b_0m.fb,2b_0m.lx,2b_0mm.i")
1453132718Skan
1454132718Skan(define_cpu_unit
1455132718Skan   "2b_0m_bs, 2b_0mi_bs, 2b_0mm_bs, 2b_0mf_bs, 2b_0b_bs, 2b_0bb_bs, 2b_0mb_bs"
1456132718Skan   "twob")
1457132718Skan(define_cpu_unit
1458132718Skan   "2b_1m_bs, 2b_1mi_bs, 2b_1mm_bs, 2b_1mf_bs, 2b_1b_bs, 2b_1bb_bs, 2b_1mb_bs"
1459132718Skan   "twob")
1460132718Skan
1461132718Skan(define_cpu_unit "2b_m_cont, 2b_mi_cont, 2b_mm_cont, 2b_mf_cont, 2b_mb_cont,\
1462132718Skan	          2b_b_cont, 2b_bb_cont" "twob")
1463132718Skan
1464132718Skan;; For stop in the middle of the bundles.
1465132718Skan(define_cpu_unit "2b_m_stop, 2b_m0_stop, 2b_m1_stop, 2b_0mmi_cont" "twob")
1466132718Skan(define_cpu_unit "2b_mi_stop, 2b_mi0_stop, 2b_mi1_stop, 2b_0mii_cont" "twob")
1467132718Skan
1468132718Skan(final_presence_set "2b_0m_bs"
1469132718Skan   "2b_0m.ii, 2b_0m.mi, 2b_0m.mf, 2b_0m.fi, 2b_0m.bb,\
1470132718Skan    2b_0m.ib, 2b_0m.fb, 2b_0m.mb, 2b_0m.lx")
1471132718Skan(final_presence_set "2b_1m_bs"
1472132718Skan   "2b_1m.ii, 2b_1m.mi, 2b_1m.mf, 2b_1m.fi, 2b_1m.bb,\
1473132718Skan    2b_1m.ib, 2b_1m.fb, 2b_1m.mb, 2b_1m.lx")
1474132718Skan(final_presence_set "2b_0mi_bs"  "2b_0mi.i, 2b_0mi.i")
1475132718Skan(final_presence_set "2b_1mi_bs"  "2b_1mi.i, 2b_1mi.i")
1476132718Skan(final_presence_set "2b_0mm_bs"  "2b_0mm.i, 2b_0mm.f, 2b_0mm.b")
1477132718Skan(final_presence_set "2b_1mm_bs"  "2b_1mm.i, 2b_1mm.f, 2b_1mm.b")
1478132718Skan(final_presence_set "2b_0mf_bs"  "2b_0mf.i, 2b_0mf.b")
1479132718Skan(final_presence_set "2b_1mf_bs"  "2b_1mf.i, 2b_1mf.b")
1480132718Skan(final_presence_set "2b_0b_bs"  "2b_0b.bb")
1481132718Skan(final_presence_set "2b_1b_bs"  "2b_1b.bb")
1482132718Skan(final_presence_set "2b_0bb_bs"  "2b_0bb.b")
1483132718Skan(final_presence_set "2b_1bb_bs"  "2b_1bb.b")
1484132718Skan(final_presence_set "2b_0mb_bs"  "2b_0mb.b")
1485132718Skan(final_presence_set "2b_1mb_bs"  "2b_1mb.b")
1486132718Skan
1487132718Skan(exclusion_set "2b_0m_bs"
1488132718Skan   "2b_0mi.i, 2b_0mm.i, 2b_0mm.f, 2b_0mf.i, 2b_0mb.b,\
1489132718Skan    2b_0mi.b, 2b_0mf.b, 2b_0mm.b, 2b_0mlx., 2b_m0_stop")
1490132718Skan(exclusion_set "2b_1m_bs"
1491132718Skan   "2b_1mi.i, 2b_1mm.i, 2b_1mm.f, 2b_1mf.i, 2b_1mb.b,\
1492132718Skan    2b_1mi.b, 2b_1mf.b, 2b_1mm.b, 2b_1mlx., 2b_m1_stop")
1493132718Skan(exclusion_set "2b_0mi_bs"  "2b_0mii., 2b_0mib., 2b_mi0_stop")
1494132718Skan(exclusion_set "2b_1mi_bs"  "2b_1mii., 2b_1mib., 2b_mi1_stop")
1495132718Skan(exclusion_set "2b_0mm_bs"  "2b_0mmi., 2b_0mmf., 2b_0mmb.")
1496132718Skan(exclusion_set "2b_1mm_bs"  "2b_1mmi., 2b_1mmf., 2b_1mmb.")
1497132718Skan(exclusion_set "2b_0mf_bs"  "2b_0mfi., 2b_0mfb.")
1498132718Skan(exclusion_set "2b_1mf_bs"  "2b_1mfi., 2b_1mfb.")
1499132718Skan(exclusion_set "2b_0b_bs"  "2b_0bb.b")
1500132718Skan(exclusion_set "2b_1b_bs"  "2b_1bb.b")
1501132718Skan(exclusion_set "2b_0bb_bs"  "2b_0bbb.")
1502132718Skan(exclusion_set "2b_1bb_bs"  "2b_1bbb.")
1503132718Skan(exclusion_set "2b_0mb_bs"  "2b_0mbb.")
1504132718Skan(exclusion_set "2b_1mb_bs"  "2b_1mbb.")
1505132718Skan
1506132718Skan(exclusion_set
1507132718Skan   "2b_0m_bs, 2b_0mi_bs, 2b_0mm_bs, 2b_0mf_bs, 2b_0b_bs, 2b_0bb_bs, 2b_0mb_bs,
1508132718Skan    2b_1m_bs, 2b_1mi_bs, 2b_1mm_bs, 2b_1mf_bs, 2b_1b_bs, 2b_1bb_bs, 2b_1mb_bs"
1509132718Skan   "2b_stop")
1510132718Skan
1511132718Skan(final_presence_set
1512132718Skan   "2b_0mi.i, 2b_0mm.i, 2b_0mf.i, 2b_0mm.f, 2b_0mb.b,\
1513132718Skan    2b_0mi.b, 2b_0mm.b, 2b_0mf.b, 2b_0mlx."
1514132718Skan   "2b_m_cont")
1515132718Skan(final_presence_set "2b_0mii., 2b_0mib." "2b_mi_cont")
1516132718Skan(final_presence_set "2b_0mmi., 2b_0mmf., 2b_0mmb." "2b_mm_cont")
1517132718Skan(final_presence_set "2b_0mfi., 2b_0mfb." "2b_mf_cont")
1518132718Skan(final_presence_set "2b_0bb.b" "2b_b_cont")
1519132718Skan(final_presence_set "2b_0bbb." "2b_bb_cont")
1520132718Skan(final_presence_set "2b_0mbb." "2b_mb_cont")
1521132718Skan
1522132718Skan(exclusion_set
1523132718Skan   "2b_0m.ii, 2b_0m.mi, 2b_0m.fi, 2b_0m.mf, 2b_0b.bb, 2b_0m.bb,\
1524132718Skan    2b_0m.ib, 2b_0m.mb, 2b_0m.fb, 2b_0m.lx"
1525132718Skan   "2b_m_cont, 2b_mi_cont, 2b_mm_cont, 2b_mf_cont,\
1526132718Skan    2b_mb_cont, 2b_b_cont, 2b_bb_cont")
1527132718Skan
1528132718Skan(exclusion_set "2b_empty"
1529132718Skan               "2b_m_cont,2b_mi_cont,2b_mm_cont,2b_mf_cont,\
1530132718Skan                2b_mb_cont,2b_b_cont,2b_bb_cont")
1531132718Skan
1532132718Skan;; For m;mi bundle
1533132718Skan(final_presence_set "2b_m0_stop" "2b_0m.mi")
1534132718Skan(final_presence_set "2b_0mm.i" "2b_0mmi_cont")
1535132718Skan(exclusion_set "2b_0mmi_cont"
1536132718Skan   "2b_0m.ii, 2b_0m.mi, 2b_0m.fi, 2b_0m.mf, 2b_0b.bb, 2b_0m.bb,\
1537132718Skan    2b_0m.ib, 2b_0m.mb, 2b_0m.fb, 2b_0m.lx")
1538132718Skan(exclusion_set "2b_m0_stop" "2b_0mm.i")
1539132718Skan(final_presence_set "2b_m1_stop" "2b_1m.mi")
1540132718Skan(exclusion_set "2b_m1_stop" "2b_1mm.i")
1541132718Skan(final_presence_set "2b_m_stop" "2b_m0_stop, 2b_m1_stop")
1542132718Skan
1543132718Skan;; For mi;i bundle
1544132718Skan(final_presence_set "2b_mi0_stop" "2b_0mi.i")
1545132718Skan(final_presence_set "2b_0mii." "2b_0mii_cont")
1546132718Skan(exclusion_set "2b_0mii_cont"
1547132718Skan   "2b_0m.ii, 2b_0m.mi, 2b_0m.fi, 2b_0m.mf, 2b_0b.bb, 2b_0m.bb,\
1548132718Skan    2b_0m.ib, 2b_0m.mb, 2b_0m.fb, 2b_0m.lx")
1549132718Skan(exclusion_set "2b_mi0_stop" "2b_0mii.")
1550132718Skan(final_presence_set "2b_mi1_stop" "2b_1mi.i")
1551132718Skan(exclusion_set "2b_mi1_stop" "2b_1mii.")
1552132718Skan(final_presence_set "2b_mi_stop" "2b_mi0_stop, 2b_mi1_stop")
1553132718Skan
1554132718Skan(final_absence_set
1555132718Skan   "2b_0m.ii,2b_0mi.i,2b_0mii.,2b_0m.mi,2b_0mm.i,2b_0mmi.,\
1556132718Skan    2b_0m.fi,2b_0mf.i,2b_0mfi.,2b_0m.mf,2b_0mm.f,2b_0mmf.,\
1557132718Skan    2b_0b.bb,2b_0bb.b,2b_0bbb.,2b_0m.bb,2b_0mb.b,2b_0mbb.,\
1558132718Skan    2b_0m.ib,2b_0mi.b,2b_0mib.,2b_0m.mb,2b_0mm.b,2b_0mmb.,\
1559132718Skan    2b_0m.fb,2b_0mf.b,2b_0mfb.,2b_0m.lx,2b_0mlx., \
1560132718Skan    2b_1m.ii,2b_1mi.i,2b_1mii.,2b_1m.mi,2b_1mm.i,2b_1mmi.,\
1561132718Skan    2b_1m.fi,2b_1mf.i,2b_1mfi.,2b_1m.mf,2b_1mm.f,2b_1mmf.,\
1562132718Skan    2b_1b.bb,2b_1bb.b,2b_1bbb.,2b_1m.bb,2b_1mb.b,2b_1mbb.,\
1563132718Skan    2b_1m.ib,2b_1mi.b,2b_1mib.,2b_1m.mb,2b_1mm.b,2b_1mmb.,\
1564132718Skan    2b_1m.fb,2b_1mf.b,2b_1mfb.,2b_1m.lx,2b_1mlx."
1565132718Skan   "2b_m0_stop,2b_m1_stop,2b_mi0_stop,2b_mi1_stop")
1566132718Skan
1567132718Skan(define_insn_reservation "2b_stop_bit" 0
1568132718Skan  (and (and (eq_attr "cpu" "itanium2")
1569132718Skan            (eq_attr "itanium_class" "stop_bit"))
1570132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1571132718Skan  "2b_stop|2b_m0_stop|2b_m1_stop|2b_mi0_stop|2b_mi1_stop")
1572132718Skan(define_insn_reservation "2b_br"      0
1573132718Skan  (and (and (eq_attr "cpu" "itanium2")
1574132718Skan            (eq_attr "itanium_class" "br"))
1575132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_B")
1576132718Skan(define_insn_reservation "2b_scall"   0
1577132718Skan  (and (and (eq_attr "cpu" "itanium2")
1578132718Skan            (eq_attr "itanium_class" "scall"))
1579132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_B")
1580132718Skan(define_insn_reservation "2b_fcmp"    2
1581132718Skan  (and (and (eq_attr "cpu" "itanium2")
1582132718Skan            (eq_attr "itanium_class" "fcmp"))
1583132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_F")
1584132718Skan(define_insn_reservation "2b_fcvtfx"  4
1585132718Skan  (and (and (eq_attr "cpu" "itanium2")
1586132718Skan            (eq_attr "itanium_class" "fcvtfx"))
1587132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_F")
1588132718Skan(define_insn_reservation "2b_fld"     6
1589169689Skan  (and (and (and (and (eq_attr "cpu" "itanium2")
1590169689Skan                      (eq_attr "itanium_class" "fld"))
1591169689Skan                 (eq_attr "data_speculative" "no"))
1592169689Skan            (eq_attr "check_load" "no"))
1593169689Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1594169689Skan  "2b_M")
1595169689Skan(define_insn_reservation "2b_flda"    6
1596169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
1597169689Skan                 (eq_attr "itanium_class" "fld"))
1598169689Skan            (eq_attr "data_speculative" "yes"))
1599169689Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1600169689Skan  "2b_M_only_um01")
1601169689Skan(define_insn_reservation "2b_fldc"    0
1602169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
1603169689Skan                 (eq_attr "itanium_class" "fld"))
1604169689Skan            (eq_attr "check_load" "yes"))
1605169689Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1606169689Skan  "2b_M_only_um01")
1607169689Skan
1608169689Skan(define_insn_reservation "2b_fldp"    6
1609169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
1610169689Skan		 (eq_attr "itanium_class" "fldp"))
1611169689Skan	    (eq_attr "check_load" "no"))
1612169689Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1613169689Skan  "2b_M_only_um01")
1614169689Skan(define_insn_reservation "2b_fldpc"   0
1615169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
1616169689Skan		 (eq_attr "itanium_class" "fldp"))
1617169689Skan	    (eq_attr "check_load" "yes"))
1618169689Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1619169689Skan  "2b_M_only_um01")
1620169689Skan
1621132718Skan(define_insn_reservation "2b_fmac"    4
1622132718Skan  (and (and (eq_attr "cpu" "itanium2")
1623132718Skan            (eq_attr "itanium_class" "fmac"))
1624132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_F")
1625132718Skan(define_insn_reservation "2b_fmisc"   4
1626132718Skan  (and (and (eq_attr "cpu" "itanium2")
1627132718Skan            (eq_attr "itanium_class" "fmisc"))
1628132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_F")
1629132718Skan
1630132718Skan;; Latency time ???
1631132718Skan(define_insn_reservation "2b_frar_i" 13
1632132718Skan  (and (and (eq_attr "cpu" "itanium2")
1633132718Skan            (eq_attr "itanium_class" "frar_i"))
1634132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1635132718Skan  "2b_I+2b_only_ui0")
1636132718Skan;; Latency time ???
1637132718Skan(define_insn_reservation "2b_frar_m"  6
1638132718Skan  (and (and (eq_attr "cpu" "itanium2")
1639132718Skan            (eq_attr "itanium_class" "frar_m"))
1640132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1641132718Skan  "2b_M_only_um2")
1642132718Skan(define_insn_reservation "2b_frbr"    2
1643132718Skan  (and (and (eq_attr "cpu" "itanium2")
1644132718Skan            (eq_attr "itanium_class" "frbr"))
1645132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1646132718Skan  "2b_I+2b_only_ui0")
1647132718Skan(define_insn_reservation "2b_frfr"    5				  
1648132718Skan  (and (and (eq_attr "cpu" "itanium2")
1649132718Skan            (eq_attr "itanium_class" "frfr"))
1650132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1651132718Skan  "2b_M_only_um2")
1652132718Skan(define_insn_reservation "2b_frpr"    2				  
1653132718Skan  (and (and (eq_attr "cpu" "itanium2")
1654132718Skan            (eq_attr "itanium_class" "frpr"))
1655132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1656132718Skan  "2b_I+2b_only_ui0")
1657132718Skan
1658132718Skan(define_insn_reservation "2b_ialu"      1
1659132718Skan    (and (and (eq_attr "cpu" "itanium2")
1660132718Skan              (eq_attr "itanium_class" "ialu"))
1661132718Skan         (ne (symbol_ref "bundling_p") (const_int 0)))
1662132718Skan    "2b_A")
1663132718Skan(define_insn_reservation "2b_icmp"    1
1664132718Skan  (and (and (eq_attr "cpu" "itanium2")
1665132718Skan            (eq_attr "itanium_class" "icmp"))
1666132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_A")
1667132718Skan(define_insn_reservation "2b_ilog"    1
1668132718Skan  (and (and (eq_attr "cpu" "itanium2")
1669132718Skan            (eq_attr "itanium_class" "ilog"))
1670132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_A")
1671169689Skan(define_insn_reservation "2b_mmalua"  2
1672169689Skan  (and (and (eq_attr "cpu" "itanium2")
1673169689Skan            (eq_attr "itanium_class" "mmalua"))
1674169689Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_A")
1675132718Skan;; Latency time ???
1676132718Skan(define_insn_reservation "2b_ishf"    1
1677132718Skan  (and (and (eq_attr "cpu" "itanium2")
1678132718Skan            (eq_attr "itanium_class" "ishf"))
1679132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1680132718Skan  "2b_I+2b_only_ui0")
1681169689Skan
1682132718Skan(define_insn_reservation "2b_ld"      1
1683169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
1684169689Skan                 (eq_attr "itanium_class" "ld"))
1685169689Skan            (eq_attr "check_load" "no"))
1686132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1687132718Skan  "2b_M_only_um01")
1688169689Skan(define_insn_reservation "2b_ldc"     0
1689169689Skan  (and (and (and (eq_attr "cpu" "itanium2")
1690169689Skan                 (eq_attr "itanium_class" "ld"))
1691169689Skan            (eq_attr "check_load" "yes"))
1692169689Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1693169689Skan  "2b_M_only_um01")
1694169689Skan
1695132718Skan(define_insn_reservation "2b_long_i"  1
1696132718Skan  (and (and (eq_attr "cpu" "itanium2")
1697132718Skan            (eq_attr "itanium_class" "long_i"))
1698132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_L")
1699132718Skan
1700132718Skan;; Latency time ???
1701132718Skan(define_insn_reservation "2b_mmmul"   2
1702132718Skan  (and (and (eq_attr "cpu" "itanium2")
1703132718Skan            (eq_attr "itanium_class" "mmmul"))
1704132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1705132718Skan  "2b_I+2b_only_ui0")
1706132718Skan;; Latency time ???
1707132718Skan(define_insn_reservation "2b_mmshf"   2
1708132718Skan  (and (and (eq_attr "cpu" "itanium2")
1709132718Skan            (eq_attr "itanium_class" "mmshf"))
1710132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_I")
1711132718Skan;; Latency time ???
1712132718Skan(define_insn_reservation "2b_mmshfi"  1
1713132718Skan  (and (and (eq_attr "cpu" "itanium2")
1714132718Skan            (eq_attr "itanium_class" "mmshfi"))
1715132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_I")
1716132718Skan
1717132718Skan(define_insn_reservation "2b_rse_m"   0
1718132718Skan  (and (and (eq_attr "cpu" "itanium2")
1719132718Skan            (eq_attr "itanium_class" "rse_m"))
1720132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1721132718Skan   "(2b_0m.ii|2b_0m.mi|2b_0m.fi|2b_0m.mf|2b_0m.bb\
1722132718Skan     |2b_0m.ib|2b_0m.mb|2b_0m.fb|2b_0m.lx)+2_1+2b_um0")
1723132718Skan(define_insn_reservation "2b_sem"     0
1724132718Skan  (and (and (eq_attr "cpu" "itanium2")
1725132718Skan            (eq_attr "itanium_class" "sem"))
1726132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1727132718Skan  "2b_M_only_um23")
1728132718Skan
1729132718Skan(define_insn_reservation "2b_stf"     1
1730132718Skan  (and (and (eq_attr "cpu" "itanium2")
1731132718Skan            (eq_attr "itanium_class" "stf"))
1732132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1733132718Skan  "2b_M_only_um23")
1734132718Skan(define_insn_reservation "2b_st"      1
1735132718Skan  (and (and (eq_attr "cpu" "itanium2")
1736132718Skan            (eq_attr "itanium_class" "st"))
1737132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1738132718Skan  "2b_M_only_um23")
1739132718Skan(define_insn_reservation "2b_syst_m0" 0
1740132718Skan  (and (and (eq_attr "cpu" "itanium2")
1741132718Skan            (eq_attr "itanium_class" "syst_m0"))
1742132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1743132718Skan  "2b_M_only_um2")
1744132718Skan(define_insn_reservation "2b_syst_m"  0
1745132718Skan  (and (and (eq_attr "cpu" "itanium2")
1746132718Skan            (eq_attr "itanium_class" "syst_m"))
1747132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1748132718Skan  "2b_M_only_um0")
1749132718Skan;; Reservation???
1750132718Skan(define_insn_reservation "2b_tbit"    1
1751132718Skan  (and (and (eq_attr "cpu" "itanium2")
1752132718Skan            (eq_attr "itanium_class" "tbit"))
1753132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1754132718Skan  "2b_I+2b_only_ui0")
1755132718Skan(define_insn_reservation "2b_toar_i"  0
1756132718Skan  (and (and (eq_attr "cpu" "itanium2")
1757132718Skan            (eq_attr "itanium_class" "toar_i"))
1758132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1759132718Skan  "2b_I+2b_only_ui0")
1760132718Skan;; Latency time ???
1761132718Skan(define_insn_reservation "2b_toar_m"  5
1762132718Skan  (and (and (eq_attr "cpu" "itanium2")
1763132718Skan            (eq_attr "itanium_class" "toar_m"))
1764132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1765132718Skan  "2b_M_only_um2")
1766132718Skan;; Latency time ???
1767132718Skan(define_insn_reservation "2b_tobr"    1
1768132718Skan  (and (and (eq_attr "cpu" "itanium2")
1769132718Skan            (eq_attr "itanium_class" "tobr"))
1770132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1771132718Skan  "2b_I+2b_only_ui0")
1772132718Skan(define_insn_reservation "2b_tofr"    5
1773132718Skan  (and (and (eq_attr "cpu" "itanium2")
1774132718Skan            (eq_attr "itanium_class" "tofr"))
1775132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1776132718Skan  "2b_M_only_um23")
1777132718Skan;; Latency time ???
1778132718Skan(define_insn_reservation "2b_topr"    1
1779132718Skan  (and (and (eq_attr "cpu" "itanium2")
1780132718Skan            (eq_attr "itanium_class" "topr"))
1781132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1782132718Skan  "2b_I+2b_only_ui0")
1783132718Skan
1784132718Skan(define_insn_reservation "2b_xmpy"    4
1785132718Skan  (and (and (eq_attr "cpu" "itanium2")
1786132718Skan            (eq_attr "itanium_class" "xmpy"))
1787132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_F")
1788132718Skan;; Latency time ???
1789132718Skan(define_insn_reservation "2b_xtd"     1
1790132718Skan  (and (and (eq_attr "cpu" "itanium2")
1791132718Skan            (eq_attr "itanium_class" "xtd"))
1792132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_I")
1793169689Skan
1794169689Skan(define_insn_reservation "2b_chk_s_i" 0
1795132718Skan  (and (and (eq_attr "cpu" "itanium2")
1796169689Skan            (eq_attr "itanium_class" "chk_s_i"))
1797132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1798132718Skan  "2b_I|2b_M_only_um23")
1799169689Skan(define_insn_reservation "2b_chk_s_f" 0
1800169689Skan  (and (and (eq_attr "cpu" "itanium2")
1801169689Skan            (eq_attr "itanium_class" "chk_s_f"))
1802169689Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1803169689Skan  "2b_M_only_um23")
1804169689Skan(define_insn_reservation "2b_chk_a"   0
1805169689Skan  (and (and (eq_attr "cpu" "itanium2")
1806169689Skan            (eq_attr "itanium_class" "chk_a"))
1807169689Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1808169689Skan  "2b_M_only_um01")
1809169689Skan
1810132718Skan(define_insn_reservation "2b_lfetch"  0
1811132718Skan  (and (and (eq_attr "cpu" "itanium2")
1812132718Skan            (eq_attr "itanium_class" "lfetch"))
1813132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1814132718Skan  "2b_M_only_um01")
1815132718Skan(define_insn_reservation "2b_nop_m"   0
1816132718Skan  (and (and (eq_attr "cpu" "itanium2")
1817132718Skan            (eq_attr "itanium_class" "nop_m"))
1818132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_M")
1819132718Skan(define_insn_reservation "2b_nop_b"   0
1820132718Skan  (and (and (eq_attr "cpu" "itanium2")
1821132718Skan            (eq_attr "itanium_class" "nop_b"))
1822132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_NB")
1823132718Skan(define_insn_reservation "2b_nop_i"   0
1824132718Skan  (and (and (eq_attr "cpu" "itanium2")
1825132718Skan            (eq_attr "itanium_class" "nop_i"))
1826132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_I")
1827132718Skan(define_insn_reservation "2b_nop_f"   0
1828132718Skan  (and (and (eq_attr "cpu" "itanium2")
1829132718Skan            (eq_attr "itanium_class" "nop_f"))
1830132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_F")
1831132718Skan(define_insn_reservation "2b_nop_x"   0
1832132718Skan  (and (and (eq_attr "cpu" "itanium2")
1833132718Skan            (eq_attr "itanium_class" "nop_x"))
1834132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_L")
1835132718Skan(define_insn_reservation "2b_unknown" 1
1836132718Skan  (and (and (eq_attr "cpu" "itanium2")
1837132718Skan            (eq_attr "itanium_class" "unknown"))
1838132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "2b_empty")
1839132718Skan(define_insn_reservation "2b_nop" 0
1840132718Skan  (and (and (eq_attr "cpu" "itanium2")
1841132718Skan            (eq_attr "itanium_class" "nop"))
1842132718Skan       (ne (symbol_ref "bundling_p") (const_int 0)))
1843132718Skan  "2b_M|2b_NB|2b_I|2b_F")
1844132718Skan(define_insn_reservation "2b_ignore" 0
1845132718Skan  (and (and (eq_attr "cpu" "itanium2")
1846132718Skan            (eq_attr "itanium_class" "ignore"))
1847132718Skan       (ne (symbol_ref "bundling_p") (const_int 0))) "nothing")
1848132718Skan
1849132718Skan(define_insn_reservation "2b_pre_cycle" 0
1850132718Skan   (and (and (eq_attr "cpu" "itanium2")
1851132718Skan             (eq_attr "itanium_class" "pre_cycle"))
1852132718Skan        (ne (symbol_ref "bundling_p") (const_int 0)))
1853132718Skan                         "(2b_0m_bs, 2b_m_cont)     \
1854132718Skan                          | (2b_0mi_bs, 2b_mi_cont) \
1855132718Skan                          | (2b_0mm_bs, 2b_mm_cont) \
1856132718Skan                          | (2b_0mf_bs, 2b_mf_cont) \
1857132718Skan                          | (2b_0b_bs, 2b_b_cont)   \
1858132718Skan                          | (2b_0bb_bs, 2b_bb_cont) \
1859132718Skan                          | (2b_0mb_bs, 2b_mb_cont) \
1860132718Skan                          | (2b_1m_bs, 2b_m_cont)   \
1861132718Skan                          | (2b_1mi_bs, 2b_mi_cont) \
1862132718Skan                          | (2b_1mm_bs, 2b_mm_cont) \
1863132718Skan                          | (2b_1mf_bs, 2b_mf_cont) \
1864132718Skan                          | (2b_1b_bs, 2b_b_cont)   \
1865132718Skan                          | (2b_1bb_bs, 2b_bb_cont) \
1866132718Skan                          | (2b_1mb_bs, 2b_mb_cont) \
1867132718Skan                          | (2b_m_stop, 2b_0mmi_cont)   \
1868132718Skan                          | (2b_mi_stop, 2b_0mii_cont)")
1869132718Skan
1870