power6.md revision 1.6 1 1.1 mrg ;; Scheduling description for IBM POWER6 processor.
2 1.6 mrg ;; Copyright (C) 2006-2016 Free Software Foundation, Inc.
3 1.1 mrg ;; Contributed by Peter Steinmetz (steinmtz (a] us.ibm.com)
4 1.1 mrg ;;
5 1.1 mrg ;; This file is part of GCC.
6 1.1 mrg ;;
7 1.1 mrg ;; GCC is free software; you can redistribute it and/or modify it
8 1.1 mrg ;; under the terms of the GNU General Public License as published
9 1.1 mrg ;; by the Free Software Foundation; either version 3, or (at your
10 1.1 mrg ;; option) any later version.
11 1.1 mrg ;;
12 1.1 mrg ;; GCC is distributed in the hope that it will be useful, but WITHOUT
13 1.1 mrg ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 1.1 mrg ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 1.1 mrg ;; License for more details.
16 1.1 mrg ;;
17 1.1 mrg ;; You should have received a copy of the GNU General Public License
18 1.1 mrg ;; along with GCC; see the file COPYING3. If not see
19 1.1 mrg ;; <http://www.gnu.org/licenses/>.
20 1.1 mrg
21 1.1 mrg ;; Sources:
22 1.1 mrg
23 1.1 mrg ;; The POWER6 has 2 iu, 2 fpu, 2 lsu, and 1 bu/cru unit per engine
24 1.1 mrg ;; (2 engines per chip). The chip can issue up to 5 internal ops
25 1.1 mrg ;; per cycle.
26 1.1 mrg
27 1.1 mrg (define_automaton "power6iu,power6lsu,power6fpu,power6bu")
28 1.1 mrg
29 1.1 mrg (define_cpu_unit "iu1_power6,iu2_power6" "power6iu")
30 1.1 mrg (define_cpu_unit "lsu1_power6,lsu2_power6" "power6lsu")
31 1.1 mrg (define_cpu_unit "bpu_power6" "power6bu")
32 1.1 mrg (define_cpu_unit "fpu1_power6,fpu2_power6" "power6fpu")
33 1.1 mrg
34 1.1 mrg (define_reservation "LS2_power6"
35 1.1 mrg "lsu1_power6+lsu2_power6")
36 1.1 mrg
37 1.1 mrg (define_reservation "FPU_power6"
38 1.1 mrg "fpu1_power6|fpu2_power6")
39 1.1 mrg
40 1.1 mrg (define_reservation "BRU_power6"
41 1.1 mrg "bpu_power6")
42 1.1 mrg
43 1.1 mrg (define_reservation "LSU_power6"
44 1.1 mrg "lsu1_power6|lsu2_power6")
45 1.1 mrg
46 1.1 mrg (define_reservation "LSF_power6"
47 1.1 mrg "(lsu1_power6+fpu1_power6)\
48 1.1 mrg |(lsu1_power6+fpu2_power6)\
49 1.1 mrg |(lsu2_power6+fpu1_power6)\
50 1.1 mrg |(lsu2_power6+fpu2_power6)")
51 1.1 mrg
52 1.1 mrg (define_reservation "LX2_power6"
53 1.1 mrg "(iu1_power6+iu2_power6+lsu1_power6)\
54 1.1 mrg |(iu1_power6+iu2_power6+lsu2_power6)")
55 1.1 mrg
56 1.1 mrg (define_reservation "FX2_power6"
57 1.1 mrg "iu1_power6+iu2_power6")
58 1.1 mrg
59 1.1 mrg (define_reservation "X2F_power6"
60 1.1 mrg "(iu1_power6+iu2_power6+fpu1_power6)\
61 1.1 mrg |(iu1_power6+iu2_power6+fpu2_power6)")
62 1.1 mrg
63 1.1 mrg (define_reservation "BX2_power6"
64 1.1 mrg "iu1_power6+iu2_power6+bpu_power6")
65 1.1 mrg
66 1.1 mrg (define_reservation "LSX_power6"
67 1.1 mrg "(iu1_power6+lsu1_power6)\
68 1.1 mrg |(iu1_power6+lsu2_power6)\
69 1.1 mrg |(iu2_power6+lsu1_power6)\
70 1.1 mrg |(iu2_power6+lsu2_power6)")
71 1.1 mrg
72 1.1 mrg (define_reservation "FXU_power6"
73 1.1 mrg "iu1_power6|iu2_power6")
74 1.1 mrg
75 1.1 mrg (define_reservation "XLF_power6"
76 1.1 mrg "(iu1_power6+lsu1_power6+fpu1_power6)\
77 1.1 mrg |(iu1_power6+lsu1_power6+fpu2_power6)\
78 1.1 mrg |(iu1_power6+lsu2_power6+fpu1_power6)\
79 1.1 mrg |(iu1_power6+lsu2_power6+fpu2_power6)\
80 1.1 mrg |(iu2_power6+lsu1_power6+fpu1_power6)\
81 1.1 mrg |(iu2_power6+lsu1_power6+fpu2_power6)\
82 1.1 mrg |(iu2_power6+lsu2_power6+fpu1_power6)\
83 1.1 mrg |(iu2_power6+lsu2_power6+fpu2_power6)")
84 1.1 mrg
85 1.1 mrg (define_reservation "BRX_power6"
86 1.1 mrg "(bpu_power6+iu1_power6)\
87 1.1 mrg |(bpu_power6+iu2_power6)")
88 1.1 mrg
89 1.1 mrg ; Load/store
90 1.1 mrg
91 1.1 mrg ; The default for a value written by a fixed point load
92 1.1 mrg ; that is read/written by a subsequent fixed point op.
93 1.1 mrg (define_insn_reservation "power6-load" 2 ; fx
94 1.1 mrg (and (eq_attr "type" "load")
95 1.5 mrg (eq_attr "sign_extend" "no")
96 1.5 mrg (eq_attr "update" "no")
97 1.1 mrg (eq_attr "cpu" "power6"))
98 1.1 mrg "LSU_power6")
99 1.1 mrg
100 1.1 mrg ; define the bypass for the case where the value written
101 1.1 mrg ; by a fixed point load is used as the source value on
102 1.1 mrg ; a store.
103 1.1 mrg (define_bypass 1 "power6-load,\
104 1.1 mrg power6-load-update,\
105 1.1 mrg power6-load-update-indexed"
106 1.1 mrg "power6-store,\
107 1.1 mrg power6-store-update,\
108 1.1 mrg power6-store-update-indexed,\
109 1.1 mrg power6-fpstore,\
110 1.1 mrg power6-fpstore-update"
111 1.1 mrg "store_data_bypass_p")
112 1.1 mrg
113 1.1 mrg (define_insn_reservation "power6-load-ext" 4 ; fx
114 1.5 mrg (and (eq_attr "type" "load")
115 1.5 mrg (eq_attr "sign_extend" "yes")
116 1.5 mrg (eq_attr "update" "no")
117 1.1 mrg (eq_attr "cpu" "power6"))
118 1.1 mrg "LSU_power6")
119 1.1 mrg
120 1.1 mrg ; define the bypass for the case where the value written
121 1.1 mrg ; by a fixed point load ext is used as the source value on
122 1.1 mrg ; a store.
123 1.1 mrg (define_bypass 1 "power6-load-ext,\
124 1.1 mrg power6-load-ext-update,\
125 1.1 mrg power6-load-ext-update-indexed"
126 1.1 mrg "power6-store,\
127 1.1 mrg power6-store-update,\
128 1.1 mrg power6-store-update-indexed,\
129 1.1 mrg power6-fpstore,\
130 1.1 mrg power6-fpstore-update"
131 1.1 mrg "store_data_bypass_p")
132 1.1 mrg
133 1.1 mrg (define_insn_reservation "power6-load-update" 2 ; fx
134 1.5 mrg (and (eq_attr "type" "load")
135 1.5 mrg (eq_attr "sign_extend" "no")
136 1.5 mrg (eq_attr "update" "yes")
137 1.5 mrg (eq_attr "indexed" "no")
138 1.1 mrg (eq_attr "cpu" "power6"))
139 1.1 mrg "LSX_power6")
140 1.1 mrg
141 1.1 mrg (define_insn_reservation "power6-load-update-indexed" 2 ; fx
142 1.5 mrg (and (eq_attr "type" "load")
143 1.5 mrg (eq_attr "sign_extend" "no")
144 1.5 mrg (eq_attr "update" "yes")
145 1.5 mrg (eq_attr "indexed" "yes")
146 1.1 mrg (eq_attr "cpu" "power6"))
147 1.1 mrg "LSX_power6")
148 1.1 mrg
149 1.1 mrg (define_insn_reservation "power6-load-ext-update" 4 ; fx
150 1.5 mrg (and (eq_attr "type" "load")
151 1.5 mrg (eq_attr "sign_extend" "yes")
152 1.5 mrg (eq_attr "update" "yes")
153 1.5 mrg (eq_attr "indexed" "no")
154 1.1 mrg (eq_attr "cpu" "power6"))
155 1.1 mrg "LSX_power6")
156 1.1 mrg
157 1.1 mrg (define_insn_reservation "power6-load-ext-update-indexed" 4 ; fx
158 1.5 mrg (and (eq_attr "type" "load")
159 1.5 mrg (eq_attr "sign_extend" "yes")
160 1.5 mrg (eq_attr "update" "yes")
161 1.5 mrg (eq_attr "indexed" "yes")
162 1.1 mrg (eq_attr "cpu" "power6"))
163 1.1 mrg "LSX_power6")
164 1.1 mrg
165 1.1 mrg (define_insn_reservation "power6-fpload" 1
166 1.1 mrg (and (eq_attr "type" "fpload")
167 1.5 mrg (eq_attr "update" "no")
168 1.1 mrg (eq_attr "cpu" "power6"))
169 1.1 mrg "LSU_power6")
170 1.1 mrg
171 1.1 mrg (define_insn_reservation "power6-fpload-update" 1
172 1.5 mrg (and (eq_attr "type" "fpload")
173 1.5 mrg (eq_attr "update" "yes")
174 1.1 mrg (eq_attr "cpu" "power6"))
175 1.1 mrg "LSX_power6")
176 1.1 mrg
177 1.1 mrg (define_insn_reservation "power6-store" 14
178 1.1 mrg (and (eq_attr "type" "store")
179 1.5 mrg (eq_attr "update" "no")
180 1.1 mrg (eq_attr "cpu" "power6"))
181 1.1 mrg "LSU_power6")
182 1.1 mrg
183 1.1 mrg (define_insn_reservation "power6-store-update" 14
184 1.5 mrg (and (eq_attr "type" "store")
185 1.5 mrg (eq_attr "update" "yes")
186 1.5 mrg (eq_attr "indexed" "no")
187 1.1 mrg (eq_attr "cpu" "power6"))
188 1.1 mrg "LSX_power6")
189 1.1 mrg
190 1.1 mrg (define_insn_reservation "power6-store-update-indexed" 14
191 1.5 mrg (and (eq_attr "type" "store")
192 1.5 mrg (eq_attr "update" "yes")
193 1.5 mrg (eq_attr "indexed" "yes")
194 1.1 mrg (eq_attr "cpu" "power6"))
195 1.1 mrg "LX2_power6")
196 1.1 mrg
197 1.1 mrg (define_insn_reservation "power6-fpstore" 14
198 1.1 mrg (and (eq_attr "type" "fpstore")
199 1.5 mrg (eq_attr "update" "no")
200 1.1 mrg (eq_attr "cpu" "power6"))
201 1.1 mrg "LSF_power6")
202 1.1 mrg
203 1.1 mrg (define_insn_reservation "power6-fpstore-update" 14
204 1.5 mrg (and (eq_attr "type" "fpstore")
205 1.5 mrg (eq_attr "update" "yes")
206 1.1 mrg (eq_attr "cpu" "power6"))
207 1.1 mrg "XLF_power6")
208 1.1 mrg
209 1.1 mrg (define_insn_reservation "power6-larx" 3
210 1.1 mrg (and (eq_attr "type" "load_l")
211 1.1 mrg (eq_attr "cpu" "power6"))
212 1.1 mrg "LS2_power6")
213 1.1 mrg
214 1.1 mrg (define_insn_reservation "power6-stcx" 10 ; best case
215 1.1 mrg (and (eq_attr "type" "store_c")
216 1.1 mrg (eq_attr "cpu" "power6"))
217 1.1 mrg "LSX_power6")
218 1.1 mrg
219 1.1 mrg (define_insn_reservation "power6-sync" 11 ; N/A
220 1.1 mrg (and (eq_attr "type" "sync")
221 1.1 mrg (eq_attr "cpu" "power6"))
222 1.1 mrg "LSU_power6")
223 1.1 mrg
224 1.1 mrg (define_insn_reservation "power6-integer" 1
225 1.5 mrg (and (ior (eq_attr "type" "integer")
226 1.5 mrg (and (eq_attr "type" "add,logical")
227 1.5 mrg (eq_attr "dot" "no")))
228 1.1 mrg (eq_attr "cpu" "power6"))
229 1.1 mrg "FXU_power6")
230 1.1 mrg
231 1.1 mrg (define_insn_reservation "power6-isel" 1
232 1.1 mrg (and (eq_attr "type" "isel")
233 1.1 mrg (eq_attr "cpu" "power6"))
234 1.1 mrg "FXU_power6")
235 1.1 mrg
236 1.1 mrg (define_insn_reservation "power6-exts" 1
237 1.1 mrg (and (eq_attr "type" "exts")
238 1.5 mrg (eq_attr "dot" "no")
239 1.1 mrg (eq_attr "cpu" "power6"))
240 1.1 mrg "FXU_power6")
241 1.1 mrg
242 1.1 mrg (define_insn_reservation "power6-shift" 1
243 1.1 mrg (and (eq_attr "type" "shift")
244 1.5 mrg (eq_attr "var_shift" "no")
245 1.5 mrg (eq_attr "dot" "no")
246 1.1 mrg (eq_attr "cpu" "power6"))
247 1.1 mrg "FXU_power6")
248 1.1 mrg
249 1.3 mrg (define_insn_reservation "power6-popcnt" 1
250 1.3 mrg (and (eq_attr "type" "popcnt")
251 1.3 mrg (eq_attr "cpu" "power6"))
252 1.3 mrg "FXU_power6")
253 1.3 mrg
254 1.1 mrg (define_insn_reservation "power6-insert" 1
255 1.5 mrg (and (eq_attr "type" "insert")
256 1.5 mrg (eq_attr "size" "32")
257 1.1 mrg (eq_attr "cpu" "power6"))
258 1.1 mrg "FX2_power6")
259 1.1 mrg
260 1.1 mrg (define_insn_reservation "power6-insert-dword" 1
261 1.5 mrg (and (eq_attr "type" "insert")
262 1.5 mrg (eq_attr "size" "64")
263 1.1 mrg (eq_attr "cpu" "power6"))
264 1.1 mrg "FX2_power6")
265 1.1 mrg
266 1.1 mrg ; define the bypass for the case where the value written
267 1.1 mrg ; by a fixed point op is used as the source value on a
268 1.1 mrg ; store.
269 1.1 mrg (define_bypass 1 "power6-integer,\
270 1.1 mrg power6-exts,\
271 1.1 mrg power6-shift,\
272 1.1 mrg power6-insert,\
273 1.1 mrg power6-insert-dword"
274 1.1 mrg "power6-store,\
275 1.1 mrg power6-store-update,\
276 1.1 mrg power6-store-update-indexed,\
277 1.1 mrg power6-fpstore,\
278 1.1 mrg power6-fpstore-update"
279 1.1 mrg "store_data_bypass_p")
280 1.1 mrg
281 1.1 mrg (define_insn_reservation "power6-cntlz" 2
282 1.1 mrg (and (eq_attr "type" "cntlz")
283 1.1 mrg (eq_attr "cpu" "power6"))
284 1.1 mrg "FXU_power6")
285 1.1 mrg
286 1.1 mrg (define_bypass 1 "power6-cntlz"
287 1.1 mrg "power6-store,\
288 1.1 mrg power6-store-update,\
289 1.1 mrg power6-store-update-indexed,\
290 1.1 mrg power6-fpstore,\
291 1.1 mrg power6-fpstore-update"
292 1.1 mrg "store_data_bypass_p")
293 1.1 mrg
294 1.1 mrg (define_insn_reservation "power6-var-rotate" 4
295 1.5 mrg (and (eq_attr "type" "shift")
296 1.5 mrg (eq_attr "var_shift" "yes")
297 1.5 mrg (eq_attr "dot" "no")
298 1.1 mrg (eq_attr "cpu" "power6"))
299 1.1 mrg "FXU_power6")
300 1.1 mrg
301 1.1 mrg (define_insn_reservation "power6-trap" 1 ; N/A
302 1.1 mrg (and (eq_attr "type" "trap")
303 1.1 mrg (eq_attr "cpu" "power6"))
304 1.1 mrg "BRX_power6")
305 1.1 mrg
306 1.1 mrg (define_insn_reservation "power6-two" 1
307 1.1 mrg (and (eq_attr "type" "two")
308 1.1 mrg (eq_attr "cpu" "power6"))
309 1.1 mrg "(iu1_power6,iu1_power6)\
310 1.1 mrg |(iu1_power6+iu2_power6,nothing)\
311 1.1 mrg |(iu1_power6,iu2_power6)\
312 1.1 mrg |(iu2_power6,iu1_power6)\
313 1.1 mrg |(iu2_power6,iu2_power6)")
314 1.1 mrg
315 1.1 mrg (define_insn_reservation "power6-three" 1
316 1.1 mrg (and (eq_attr "type" "three")
317 1.1 mrg (eq_attr "cpu" "power6"))
318 1.1 mrg "(iu1_power6,iu1_power6,iu1_power6)\
319 1.1 mrg |(iu1_power6,iu1_power6,iu2_power6)\
320 1.1 mrg |(iu1_power6,iu2_power6,iu1_power6)\
321 1.1 mrg |(iu1_power6,iu2_power6,iu2_power6)\
322 1.1 mrg |(iu2_power6,iu1_power6,iu1_power6)\
323 1.1 mrg |(iu2_power6,iu1_power6,iu2_power6)\
324 1.1 mrg |(iu2_power6,iu2_power6,iu1_power6)\
325 1.1 mrg |(iu2_power6,iu2_power6,iu2_power6)\
326 1.1 mrg |(iu1_power6+iu2_power6,iu1_power6)\
327 1.1 mrg |(iu1_power6+iu2_power6,iu2_power6)\
328 1.1 mrg |(iu1_power6,iu1_power6+iu2_power6)\
329 1.1 mrg |(iu2_power6,iu1_power6+iu2_power6)")
330 1.1 mrg
331 1.1 mrg (define_insn_reservation "power6-cmp" 1
332 1.1 mrg (and (eq_attr "type" "cmp")
333 1.1 mrg (eq_attr "cpu" "power6"))
334 1.1 mrg "FXU_power6")
335 1.1 mrg
336 1.1 mrg (define_insn_reservation "power6-compare" 1
337 1.5 mrg (and (eq_attr "type" "exts")
338 1.5 mrg (eq_attr "dot" "yes")
339 1.1 mrg (eq_attr "cpu" "power6"))
340 1.1 mrg "FXU_power6")
341 1.1 mrg
342 1.1 mrg (define_insn_reservation "power6-fast-compare" 1
343 1.5 mrg (and (eq_attr "type" "add,logical")
344 1.5 mrg (eq_attr "dot" "yes")
345 1.1 mrg (eq_attr "cpu" "power6"))
346 1.1 mrg "FXU_power6")
347 1.1 mrg
348 1.1 mrg ; define the bypass for the case where the value written
349 1.1 mrg ; by a fixed point rec form op is used as the source value
350 1.1 mrg ; on a store.
351 1.1 mrg (define_bypass 1 "power6-compare,\
352 1.1 mrg power6-fast-compare"
353 1.1 mrg "power6-store,\
354 1.1 mrg power6-store-update,\
355 1.1 mrg power6-store-update-indexed,\
356 1.1 mrg power6-fpstore,\
357 1.1 mrg power6-fpstore-update"
358 1.1 mrg "store_data_bypass_p")
359 1.1 mrg
360 1.1 mrg (define_insn_reservation "power6-delayed-compare" 2 ; N/A
361 1.5 mrg (and (eq_attr "type" "shift")
362 1.5 mrg (eq_attr "var_shift" "no")
363 1.5 mrg (eq_attr "dot" "yes")
364 1.1 mrg (eq_attr "cpu" "power6"))
365 1.1 mrg "FXU_power6")
366 1.1 mrg
367 1.1 mrg (define_insn_reservation "power6-var-delayed-compare" 4
368 1.5 mrg (and (eq_attr "type" "shift")
369 1.5 mrg (eq_attr "var_shift" "yes")
370 1.5 mrg (eq_attr "dot" "yes")
371 1.1 mrg (eq_attr "cpu" "power6"))
372 1.1 mrg "FXU_power6")
373 1.1 mrg
374 1.1 mrg (define_insn_reservation "power6-lmul-cmp" 16
375 1.5 mrg (and (eq_attr "type" "mul")
376 1.5 mrg (eq_attr "dot" "yes")
377 1.5 mrg (eq_attr "size" "64")
378 1.1 mrg (eq_attr "cpu" "power6"))
379 1.1 mrg "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
380 1.1 mrg |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
381 1.1 mrg
382 1.1 mrg (define_insn_reservation "power6-imul-cmp" 16
383 1.5 mrg (and (eq_attr "type" "mul")
384 1.5 mrg (eq_attr "dot" "yes")
385 1.5 mrg (eq_attr "size" "32")
386 1.1 mrg (eq_attr "cpu" "power6"))
387 1.1 mrg "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
388 1.1 mrg |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
389 1.1 mrg
390 1.1 mrg (define_insn_reservation "power6-lmul" 16
391 1.5 mrg (and (eq_attr "type" "mul")
392 1.5 mrg (eq_attr "dot" "no")
393 1.5 mrg (eq_attr "size" "64")
394 1.1 mrg (eq_attr "cpu" "power6"))
395 1.1 mrg "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
396 1.1 mrg |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
397 1.1 mrg
398 1.1 mrg (define_insn_reservation "power6-imul" 16
399 1.5 mrg (and (eq_attr "type" "mul")
400 1.5 mrg (eq_attr "dot" "no")
401 1.5 mrg (eq_attr "size" "32")
402 1.1 mrg (eq_attr "cpu" "power6"))
403 1.1 mrg "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
404 1.1 mrg |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
405 1.1 mrg
406 1.1 mrg (define_insn_reservation "power6-imul3" 16
407 1.5 mrg (and (eq_attr "type" "mul")
408 1.5 mrg (eq_attr "size" "8,16")
409 1.1 mrg (eq_attr "cpu" "power6"))
410 1.1 mrg "(iu1_power6*16+iu2_power6*16+fpu1_power6*16)\
411 1.1 mrg |(iu1_power6*16+iu2_power6*16+fpu2_power6*16)");
412 1.1 mrg
413 1.1 mrg (define_bypass 9 "power6-imul,\
414 1.1 mrg power6-lmul,\
415 1.1 mrg power6-imul-cmp,\
416 1.1 mrg power6-lmul-cmp,\
417 1.1 mrg power6-imul3"
418 1.1 mrg "power6-store,\
419 1.1 mrg power6-store-update,\
420 1.1 mrg power6-store-update-indexed,\
421 1.1 mrg power6-fpstore,\
422 1.1 mrg power6-fpstore-update"
423 1.1 mrg "store_data_bypass_p")
424 1.1 mrg
425 1.1 mrg (define_insn_reservation "power6-idiv" 44
426 1.5 mrg (and (eq_attr "type" "div")
427 1.5 mrg (eq_attr "size" "32")
428 1.1 mrg (eq_attr "cpu" "power6"))
429 1.1 mrg "(iu1_power6*44+iu2_power6*44+fpu1_power6*44)\
430 1.1 mrg |(iu1_power6*44+iu2_power6*44+fpu2_power6*44)");
431 1.1 mrg
432 1.1 mrg ; The latency for this bypass is yet to be defined
433 1.1 mrg ;(define_bypass ? "power6-idiv"
434 1.1 mrg ; "power6-store,\
435 1.1 mrg ; power6-store-update,\
436 1.1 mrg ; power6-store-update-indexed,\
437 1.1 mrg ; power6-fpstore,\
438 1.1 mrg ; power6-fpstore-update"
439 1.1 mrg ; "store_data_bypass_p")
440 1.1 mrg
441 1.1 mrg (define_insn_reservation "power6-ldiv" 56
442 1.5 mrg (and (eq_attr "type" "div")
443 1.5 mrg (eq_attr "size" "64")
444 1.1 mrg (eq_attr "cpu" "power6"))
445 1.1 mrg "(iu1_power6*56+iu2_power6*56+fpu1_power6*56)\
446 1.1 mrg |(iu1_power6*56+iu2_power6*56+fpu2_power6*56)");
447 1.1 mrg
448 1.1 mrg ; The latency for this bypass is yet to be defined
449 1.1 mrg ;(define_bypass ? "power6-ldiv"
450 1.1 mrg ; "power6-store,\
451 1.1 mrg ; power6-store-update,\
452 1.1 mrg ; power6-store-update-indexed,\
453 1.1 mrg ; power6-fpstore,\
454 1.1 mrg ; power6-fpstore-update"
455 1.1 mrg ; "store_data_bypass_p")
456 1.1 mrg
457 1.1 mrg (define_insn_reservation "power6-mtjmpr" 2
458 1.1 mrg (and (eq_attr "type" "mtjmpr,mfjmpr")
459 1.1 mrg (eq_attr "cpu" "power6"))
460 1.1 mrg "BX2_power6")
461 1.1 mrg
462 1.1 mrg (define_bypass 5 "power6-mtjmpr" "power6-branch")
463 1.1 mrg
464 1.1 mrg (define_insn_reservation "power6-branch" 2
465 1.1 mrg (and (eq_attr "type" "jmpreg,branch")
466 1.1 mrg (eq_attr "cpu" "power6"))
467 1.1 mrg "BRU_power6")
468 1.1 mrg
469 1.1 mrg (define_bypass 5 "power6-branch" "power6-mtjmpr")
470 1.1 mrg
471 1.1 mrg (define_insn_reservation "power6-crlogical" 3
472 1.1 mrg (and (eq_attr "type" "cr_logical")
473 1.1 mrg (eq_attr "cpu" "power6"))
474 1.1 mrg "BRU_power6")
475 1.1 mrg
476 1.1 mrg (define_bypass 3 "power6-crlogical" "power6-branch")
477 1.1 mrg
478 1.1 mrg (define_insn_reservation "power6-delayedcr" 3
479 1.1 mrg (and (eq_attr "type" "delayed_cr")
480 1.1 mrg (eq_attr "cpu" "power6"))
481 1.1 mrg "BRU_power6")
482 1.1 mrg
483 1.1 mrg (define_insn_reservation "power6-mfcr" 6 ; N/A
484 1.1 mrg (and (eq_attr "type" "mfcr")
485 1.1 mrg (eq_attr "cpu" "power6"))
486 1.1 mrg "BX2_power6")
487 1.1 mrg
488 1.1 mrg ; mfcrf (1 field)
489 1.1 mrg (define_insn_reservation "power6-mfcrf" 3 ; N/A
490 1.1 mrg (and (eq_attr "type" "mfcrf")
491 1.1 mrg (eq_attr "cpu" "power6"))
492 1.1 mrg "BX2_power6") ;
493 1.1 mrg
494 1.1 mrg ; mtcrf (1 field)
495 1.1 mrg (define_insn_reservation "power6-mtcr" 4 ; N/A
496 1.1 mrg (and (eq_attr "type" "mtcr")
497 1.1 mrg (eq_attr "cpu" "power6"))
498 1.1 mrg "BX2_power6")
499 1.1 mrg
500 1.1 mrg (define_bypass 9 "power6-mtcr" "power6-branch")
501 1.1 mrg
502 1.1 mrg (define_insn_reservation "power6-fp" 6
503 1.6 mrg (and (eq_attr "type" "fp,fpsimple,dmul,dfp")
504 1.1 mrg (eq_attr "cpu" "power6"))
505 1.1 mrg "FPU_power6")
506 1.1 mrg
507 1.1 mrg ; Any fp instruction that updates a CR has a latency
508 1.1 mrg ; of 6 to a dependent branch
509 1.1 mrg (define_bypass 6 "power6-fp" "power6-branch")
510 1.1 mrg
511 1.1 mrg (define_bypass 1 "power6-fp"
512 1.1 mrg "power6-fpstore,power6-fpstore-update"
513 1.1 mrg "store_data_bypass_p")
514 1.1 mrg
515 1.1 mrg (define_insn_reservation "power6-fpcompare" 8
516 1.1 mrg (and (eq_attr "type" "fpcompare")
517 1.1 mrg (eq_attr "cpu" "power6"))
518 1.1 mrg "FPU_power6")
519 1.1 mrg
520 1.1 mrg (define_bypass 12 "power6-fpcompare"
521 1.1 mrg "power6-branch,power6-crlogical")
522 1.1 mrg
523 1.1 mrg (define_insn_reservation "power6-sdiv" 26
524 1.1 mrg (and (eq_attr "type" "sdiv")
525 1.1 mrg (eq_attr "cpu" "power6"))
526 1.1 mrg "FPU_power6")
527 1.1 mrg
528 1.1 mrg (define_insn_reservation "power6-ddiv" 32
529 1.1 mrg (and (eq_attr "type" "ddiv")
530 1.1 mrg (eq_attr "cpu" "power6"))
531 1.1 mrg "FPU_power6")
532 1.1 mrg
533 1.1 mrg (define_insn_reservation "power6-sqrt" 30
534 1.1 mrg (and (eq_attr "type" "ssqrt")
535 1.1 mrg (eq_attr "cpu" "power6"))
536 1.1 mrg "FPU_power6")
537 1.1 mrg
538 1.1 mrg (define_insn_reservation "power6-dsqrt" 42
539 1.1 mrg (and (eq_attr "type" "dsqrt")
540 1.1 mrg (eq_attr "cpu" "power6"))
541 1.1 mrg "FPU_power6")
542 1.1 mrg
543 1.1 mrg (define_insn_reservation "power6-isync" 2 ; N/A
544 1.1 mrg (and (eq_attr "type" "isync")
545 1.1 mrg (eq_attr "cpu" "power6"))
546 1.1 mrg "FXU_power6")
547 1.1 mrg
548 1.1 mrg (define_insn_reservation "power6-vecload" 1
549 1.1 mrg (and (eq_attr "type" "vecload")
550 1.1 mrg (eq_attr "cpu" "power6"))
551 1.1 mrg "LSU_power6")
552 1.1 mrg
553 1.1 mrg (define_insn_reservation "power6-vecstore" 1
554 1.1 mrg (and (eq_attr "type" "vecstore")
555 1.1 mrg (eq_attr "cpu" "power6"))
556 1.1 mrg "LSF_power6")
557 1.1 mrg
558 1.1 mrg (define_insn_reservation "power6-vecsimple" 3
559 1.6 mrg (and (eq_attr "type" "vecsimple,veclogical,vecmove")
560 1.1 mrg (eq_attr "cpu" "power6"))
561 1.1 mrg "FPU_power6")
562 1.1 mrg
563 1.1 mrg (define_bypass 6 "power6-vecsimple" "power6-veccomplex,\
564 1.1 mrg power6-vecperm")
565 1.1 mrg
566 1.1 mrg (define_bypass 5 "power6-vecsimple" "power6-vecfloat")
567 1.1 mrg
568 1.1 mrg (define_bypass 4 "power6-vecsimple" "power6-vecstore" )
569 1.1 mrg
570 1.1 mrg (define_insn_reservation "power6-veccmp" 1
571 1.6 mrg (and (eq_attr "type" "veccmp,veccmpfx")
572 1.1 mrg (eq_attr "cpu" "power6"))
573 1.1 mrg "FPU_power6")
574 1.1 mrg
575 1.1 mrg (define_bypass 10 "power6-veccmp" "power6-branch")
576 1.1 mrg
577 1.1 mrg (define_insn_reservation "power6-vecfloat" 7
578 1.1 mrg (and (eq_attr "type" "vecfloat")
579 1.1 mrg (eq_attr "cpu" "power6"))
580 1.1 mrg "FPU_power6")
581 1.1 mrg
582 1.1 mrg (define_bypass 10 "power6-vecfloat" "power6-vecsimple")
583 1.1 mrg
584 1.1 mrg (define_bypass 11 "power6-vecfloat" "power6-veccomplex,\
585 1.1 mrg power6-vecperm")
586 1.1 mrg
587 1.1 mrg (define_bypass 9 "power6-vecfloat" "power6-vecstore" )
588 1.1 mrg
589 1.1 mrg (define_insn_reservation "power6-veccomplex" 7
590 1.1 mrg (and (eq_attr "type" "vecsimple")
591 1.1 mrg (eq_attr "cpu" "power6"))
592 1.1 mrg "FPU_power6")
593 1.1 mrg
594 1.1 mrg (define_bypass 10 "power6-veccomplex" "power6-vecsimple,\
595 1.1 mrg power6-vecfloat" )
596 1.1 mrg
597 1.1 mrg (define_bypass 9 "power6-veccomplex" "power6-vecperm" )
598 1.1 mrg
599 1.1 mrg (define_bypass 8 "power6-veccomplex" "power6-vecstore" )
600 1.1 mrg
601 1.1 mrg (define_insn_reservation "power6-vecperm" 4
602 1.1 mrg (and (eq_attr "type" "vecperm")
603 1.1 mrg (eq_attr "cpu" "power6"))
604 1.1 mrg "FPU_power6")
605 1.1 mrg
606 1.1 mrg (define_bypass 7 "power6-vecperm" "power6-vecsimple,\
607 1.1 mrg power6-vecfloat" )
608 1.1 mrg
609 1.1 mrg (define_bypass 6 "power6-vecperm" "power6-veccomplex" )
610 1.1 mrg
611 1.1 mrg (define_bypass 5 "power6-vecperm" "power6-vecstore" )
612 1.1 mrg
613 1.1 mrg (define_insn_reservation "power6-mftgpr" 8
614 1.1 mrg (and (eq_attr "type" "mftgpr")
615 1.1 mrg (eq_attr "cpu" "power6"))
616 1.1 mrg "X2F_power6")
617 1.1 mrg
618 1.1 mrg (define_insn_reservation "power6-mffgpr" 14
619 1.1 mrg (and (eq_attr "type" "mffgpr")
620 1.1 mrg (eq_attr "cpu" "power6"))
621 1.1 mrg "LX2_power6")
622 1.1 mrg
623 1.1 mrg (define_bypass 4 "power6-mftgpr" "power6-imul,\
624 1.1 mrg power6-lmul,\
625 1.1 mrg power6-imul-cmp,\
626 1.1 mrg power6-lmul-cmp,\
627 1.1 mrg power6-imul3,\
628 1.1 mrg power6-idiv,\
629 1.1 mrg power6-ldiv" )
630