1 ;; Copyright (C) 2012-2017 Free Software Foundation, Inc.
3 ;; This file is part of GCC.
5 ;; GCC is free software; you can redistribute it and/or modify
6 ;; it under the terms of the GNU General Public License as published by
7 ;; the Free Software Foundation; either version 3, or (at your option)
10 ;; GCC is distributed in the hope that it will be useful,
11 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ;; GNU General Public License for more details.
15 ;; You should have received a copy of the GNU General Public License
16 ;; along with GCC; see the file COPYING3. If not see
17 ;; <http://www.gnu.org/licenses/>.
19 ;; AMD bdver3 and bdver4 Scheduling
21 ;; The bdver3 and bdver4 contains three pipelined FP units and two integer
22 ;; units. ;; Fetching and decoding logic is different from previous fam15
23 ;; processors. Fetching is done every two cycles rather than every cycle
24 ;; and two decode units are available. The decode units therefore decode
25 ;; four instructions in two cycles.
27 ;; The load/store queue unit is not attached to the schedulers but
28 ;; communicates with all the execution units separately instead.
30 ;; bdver3 and bdver4 belong to fam15 processors. We use the same insn
31 ;; attribute that was used for bdver1 decoding scheme.
33 (define_automaton "bdver3,bdver3_ieu,bdver3_load,bdver3_fp,bdver3_agu")
35 (define_cpu_unit "bdver3-decode0" "bdver3")
36 (define_cpu_unit "bdver3-decode1" "bdver3")
37 (define_cpu_unit "bdver3-decode2" "bdver3")
38 (define_cpu_unit "bdver3-decode3" "bdver3")
40 ;; Double decoded instructions take two cycles whereas
41 ;; direct instructions take one cycle.
42 ;; Vectorpath instructions are single issue instructions.
43 ;; So, we engage all units vector instructions.
44 (define_reservation "bdver3-vector" "bdver3-decode0+bdver3-decode1+bdver3-decode2+bdver3-decode3")
46 ;; Direct instructions can be issued to any of the four decoders
47 (define_reservation "bdver3-direct" "(bdver3-decode0|bdver3-decode1|bdver3-decode2|bdver3-decode3)")
49 ;; Double instructions take two cycles to decode.
50 (define_reservation "bdver3-double" "(bdver3-decode0,bdver3-decode0)|
51 (bdver3-decode1,bdver3-decode1)| (bdver3-decode2,bdver3-decode2)|
52 (bdver3-decode3,bdver3-decode3)")
54 (define_cpu_unit "bdver3-ieu0" "bdver3_ieu")
55 (define_cpu_unit "bdver3-ieu1" "bdver3_ieu")
56 (define_reservation "bdver3-ieu" "(bdver3-ieu0|bdver3-ieu1)")
58 (define_cpu_unit "bdver3-agu0" "bdver3_agu")
59 (define_cpu_unit "bdver3-agu1" "bdver3_agu")
60 (define_reservation "bdver3-agu" "(bdver3-agu0|bdver3-agu1)")
62 (define_cpu_unit "bdver3-load0" "bdver3_load")
63 (define_cpu_unit "bdver3-load1" "bdver3_load")
64 (define_reservation "bdver3-load" "bdver3-agu,
65 (bdver3-load0|bdver3-load1),nothing")
66 ;; 128bit SSE instructions issue two loads at once.
67 (define_reservation "bdver3-load2" "bdver3-agu,
68 (bdver3-load0+bdver3-load1),nothing")
70 (define_reservation "bdver3-store" "(bdver3-load0 | bdver3-load1)")
71 ;; 128bit SSE instructions issue two stores at once.
72 (define_reservation "bdver3-store2" "(bdver3-load0+bdver3-load1)")
74 ;; vectorpath (microcoded) instructions are single issue instructions.
75 ;; So, they occupy all the integer units.
76 (define_reservation "bdver3-ivector" "bdver3-ieu0+bdver3-ieu1+
77 bdver3-agu0+bdver3-agu1+
78 bdver3-load0+bdver3-load1")
80 (define_reservation "bdver3-fpsched" "nothing,nothing,nothing")
82 ;; The floating point loads.
83 (define_reservation "bdver3-fpload" "(bdver3-fpsched + bdver3-load)")
84 (define_reservation "bdver3-fpload2" "(bdver3-fpsched + bdver3-load2)")
87 (define_cpu_unit "bdver3-ffma0" "bdver3_fp")
88 (define_cpu_unit "bdver3-ffma1" "bdver3_fp")
89 (define_cpu_unit "bdver3-fpsto" "bdver3_fp")
91 (define_reservation "bdver3-fvector" "bdver3-ffma0+bdver3-ffma1+
92 bdver3-fpsto+bdver3-load0+
95 (define_reservation "bdver3-ffma" "(bdver3-ffma0 | bdver3-ffma1)")
96 (define_reservation "bdver3-fcvt" "bdver3-ffma0")
97 (define_reservation "bdver3-fmma" "bdver3-ffma0")
98 (define_reservation "bdver3-fxbar" "bdver3-ffma1")
99 (define_reservation "bdver3-fmal" "(bdver3-ffma0 | bdver3-fpsto)")
100 (define_reservation "bdver3-fsto" "bdver3-fpsto")
101 (define_reservation "bdver3-fpshuf" "bdver3-fpsto")
103 ;; Jump instructions are executed in the branch unit completely transparent to us.
104 (define_insn_reservation "bdver3_call" 2
105 (and (eq_attr "cpu" "bdver3,bdver4")
106 (eq_attr "type" "call,callv"))
107 "bdver3-double,(bdver3-agu | bdver3-ieu),nothing")
108 ;; PUSH mem is double path.
109 (define_insn_reservation "bdver3_push" 1
110 (and (eq_attr "cpu" "bdver3,bdver4")
111 (eq_attr "type" "push"))
112 "bdver3-direct,bdver3-ieu,bdver3-store")
113 ;; POP r16/mem are double path.
114 (define_insn_reservation "bdver3_pop" 1
115 (and (eq_attr "cpu" "bdver3,bdver4")
116 (eq_attr "type" "pop"))
117 "bdver3-direct,bdver3-ivector")
118 ;; LEAVE no latency info so far, assume same with amdfam10.
119 (define_insn_reservation "bdver3_leave" 3
120 (and (eq_attr "cpu" "bdver3,bdver4")
121 (eq_attr "type" "leave"))
122 "bdver3-vector,bdver3-ivector")
123 ;; LEA executes in AGU unit with 1 cycle latency on BDVER3.
124 (define_insn_reservation "bdver3_lea" 1
125 (and (eq_attr "cpu" "bdver3,bdver4")
126 (eq_attr "type" "lea"))
127 "bdver3-direct,bdver3-ieu")
128 ;; MUL executes in special multiplier unit attached to IEU1.
129 (define_insn_reservation "bdver3_imul_DI" 6
130 (and (eq_attr "cpu" "bdver3,bdver4")
131 (and (eq_attr "type" "imul")
132 (and (eq_attr "mode" "DI")
133 (eq_attr "memory" "none,unknown"))))
134 "bdver3-direct,bdver3-ieu1")
135 (define_insn_reservation "bdver3_imul" 4
136 (and (eq_attr "cpu" "bdver3,bdver4")
137 (and (eq_attr "type" "imul")
138 (eq_attr "memory" "none,unknown")))
139 "bdver3-direct,bdver3-ieu1")
140 (define_insn_reservation "bdver3_imul_mem_DI" 10
141 (and (eq_attr "cpu" "bdver3,bdver4")
142 (and (eq_attr "type" "imul")
143 (and (eq_attr "mode" "DI")
144 (eq_attr "memory" "load,both"))))
145 "bdver3-direct,bdver3-load,bdver3-ieu1")
146 (define_insn_reservation "bdver3_imul_mem" 8
147 (and (eq_attr "cpu" "bdver3,bdver4")
148 (and (eq_attr "type" "imul")
149 (eq_attr "memory" "load,both")))
150 "bdver3-direct,bdver3-load,bdver3-ieu1")
152 (define_insn_reservation "bdver3_str" 6
153 (and (eq_attr "cpu" "bdver3,bdver4")
154 (and (eq_attr "type" "str")
155 (eq_attr "memory" "load,both,store")))
156 "bdver3-vector,bdver3-load,bdver3-ivector")
158 ;; Integer instructions.
159 (define_insn_reservation "bdver3_idirect" 1
160 (and (eq_attr "cpu" "bdver3,bdver4")
161 (and (eq_attr "bdver1_decode" "direct")
162 (and (eq_attr "unit" "integer,unknown")
163 (eq_attr "memory" "none,unknown"))))
164 "bdver3-direct,(bdver3-ieu|bdver3-agu)")
165 (define_insn_reservation "bdver3_ivector" 2
166 (and (eq_attr "cpu" "bdver3,bdver4")
167 (and (eq_attr "bdver1_decode" "vector")
168 (and (eq_attr "unit" "integer,unknown")
169 (eq_attr "memory" "none,unknown"))))
170 "bdver3-vector,bdver3-ivector")
171 (define_insn_reservation "bdver3_idirect_loadmov" 4
172 (and (eq_attr "cpu" "bdver3,bdver4")
173 (and (eq_attr "type" "imov")
174 (eq_attr "memory" "load")))
175 "bdver3-direct,bdver3-load")
176 (define_insn_reservation "bdver3_idirect_load" 5
177 (and (eq_attr "cpu" "bdver3,bdver4")
178 (and (eq_attr "bdver1_decode" "direct")
179 (and (eq_attr "unit" "integer,unknown")
180 (eq_attr "memory" "load"))))
181 "bdver3-direct,bdver3-load,bdver3-ieu")
182 (define_insn_reservation "bdver3_idirect_movstore" 5
183 (and (eq_attr "cpu" "bdver3,bdver4")
184 (and (eq_attr "type" "imov")
185 (eq_attr "memory" "store")))
186 "bdver3-direct,bdver3-ieu,bdver3-store")
187 (define_insn_reservation "bdver3_idirect_both" 4
188 (and (eq_attr "cpu" "bdver3,bdver4")
189 (and (eq_attr "bdver1_decode" "direct")
190 (and (eq_attr "unit" "integer,unknown")
191 (eq_attr "memory" "both"))))
192 "bdver3-direct,bdver3-load,
193 bdver3-ieu,bdver3-store,
195 (define_insn_reservation "bdver3_idirect_store" 4
196 (and (eq_attr "cpu" "bdver3,bdver4")
197 (and (eq_attr "bdver1_decode" "direct")
198 (and (eq_attr "unit" "integer,unknown")
199 (eq_attr "memory" "store"))))
200 "bdver3-direct,(bdver3-ieu+bdver3-agu),
202 ;; BDVER3 floating point units.
203 (define_insn_reservation "bdver3_fldxf" 13
204 (and (eq_attr "cpu" "bdver3,bdver4")
205 (and (eq_attr "type" "fmov")
206 (and (eq_attr "memory" "load")
207 (eq_attr "mode" "XF"))))
208 "bdver3-vector,bdver3-fpload2,bdver3-fvector*9")
209 (define_insn_reservation "bdver3_fld" 2
210 (and (eq_attr "cpu" "bdver3,bdver4")
211 (and (eq_attr "type" "fmov")
212 (eq_attr "memory" "load")))
213 "bdver3-direct,bdver3-fpload,bdver3-ffma")
214 (define_insn_reservation "bdver3_fstxf" 4
215 (and (eq_attr "cpu" "bdver3,bdver4")
216 (and (eq_attr "type" "fmov")
217 (and (eq_attr "memory" "store,both")
218 (eq_attr "mode" "XF"))))
219 "bdver3-vector,(bdver3-fpsched+bdver3-agu),(bdver3-store2+(bdver3-fvector*6))")
220 (define_insn_reservation "bdver3_fst" 2
221 (and (eq_attr "cpu" "bdver3,bdver4")
222 (and (eq_attr "type" "fmov")
223 (eq_attr "memory" "store,both")))
224 "bdver3-double,(bdver3-fpsched),(bdver3-fsto+bdver3-store)")
225 (define_insn_reservation "bdver3_fist" 2
226 (and (eq_attr "cpu" "bdver3,bdver4")
227 (eq_attr "type" "fistp,fisttp"))
228 "bdver3-double,(bdver3-fpsched),(bdver3-fsto+bdver3-store)")
229 (define_insn_reservation "bdver3_fmov_bdver3" 2
230 (and (eq_attr "cpu" "bdver3,bdver4")
231 (eq_attr "type" "fmov"))
232 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
233 (define_insn_reservation "bdver3_fadd_load" 10
234 (and (eq_attr "cpu" "bdver3,bdver4")
235 (and (eq_attr "type" "fop")
236 (eq_attr "memory" "load")))
237 "bdver3-direct,bdver3-fpload,bdver3-ffma")
238 (define_insn_reservation "bdver3_fadd" 6
239 (and (eq_attr "cpu" "bdver3,bdver4")
240 (eq_attr "type" "fop"))
241 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
242 (define_insn_reservation "bdver3_fmul_load" 6
243 (and (eq_attr "cpu" "bdver3,bdver4")
244 (and (eq_attr "type" "fmul")
245 (eq_attr "memory" "load")))
246 "bdver3-double,bdver3-fpload,bdver3-ffma")
247 (define_insn_reservation "bdver3_fmul" 6
248 (and (eq_attr "cpu" "bdver3,bdver4")
249 (eq_attr "type" "fmul"))
250 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
251 (define_insn_reservation "bdver3_fsgn" 2
252 (and (eq_attr "cpu" "bdver3,bdver4")
253 (eq_attr "type" "fsgn"))
254 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
255 (define_insn_reservation "bdver3_fdiv_load" 42
256 (and (eq_attr "cpu" "bdver3,bdver4")
257 (and (eq_attr "type" "fdiv")
258 (eq_attr "memory" "load")))
259 "bdver3-direct,bdver3-fpload,bdver3-ffma")
260 (define_insn_reservation "bdver3_fdiv" 42
261 (and (eq_attr "cpu" "bdver3,bdver4")
262 (eq_attr "type" "fdiv"))
263 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
264 (define_insn_reservation "bdver3_fpspc_load" 143
265 (and (eq_attr "cpu" "bdver3,bdver4")
266 (and (eq_attr "type" "fpspc")
267 (eq_attr "memory" "load")))
268 "bdver3-vector,bdver3-fpload,bdver3-fvector")
269 (define_insn_reservation "bdver3_fcmov_load" 17
270 (and (eq_attr "cpu" "bdver3,bdver4")
271 (and (eq_attr "type" "fcmov")
272 (eq_attr "memory" "load")))
273 "bdver3-vector,bdver3-fpload,bdver3-fvector")
274 (define_insn_reservation "bdver3_fcmov" 15
275 (and (eq_attr "cpu" "bdver3,bdver4")
276 (eq_attr "type" "fcmov"))
277 "bdver3-vector,bdver3-fpsched,bdver3-fvector")
278 (define_insn_reservation "bdver3_fcomi_load" 6
279 (and (eq_attr "cpu" "bdver3,bdver4")
280 (and (eq_attr "type" "fcmp")
281 (and (eq_attr "bdver1_decode" "double")
282 (eq_attr "memory" "load"))))
283 "bdver3-double,bdver3-fpload,(bdver3-ffma | bdver3-fsto)")
284 (define_insn_reservation "bdver3_fcomi" 2
285 (and (eq_attr "cpu" "bdver3,bdver4")
286 (and (eq_attr "bdver1_decode" "double")
287 (eq_attr "type" "fcmp")))
288 "bdver3-double,bdver3-fpsched,(bdver3-ffma | bdver3-fsto)")
289 (define_insn_reservation "bdver3_fcom_load" 6
290 (and (eq_attr "cpu" "bdver3,bdver4")
291 (and (eq_attr "type" "fcmp")
292 (eq_attr "memory" "load")))
293 "bdver3-direct,bdver3-fpload,bdver3-ffma")
294 (define_insn_reservation "bdver3_fcom" 2
295 (and (eq_attr "cpu" "bdver3,bdver4")
296 (eq_attr "type" "fcmp"))
297 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
298 (define_insn_reservation "bdver3_fxch" 2
299 (and (eq_attr "cpu" "bdver3,bdver4")
300 (eq_attr "type" "fxch"))
301 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
304 (define_insn_reservation "bdver3_ssevector_avx128_unaligned_load" 4
305 (and (eq_attr "cpu" "bdver3,bdver4")
306 (and (eq_attr "type" "ssemov")
307 (and (eq_attr "prefix" "vex")
308 (and (eq_attr "movu" "1")
309 (and (eq_attr "mode" "V4SF,V2DF")
310 (eq_attr "memory" "load"))))))
311 "bdver3-direct,bdver3-fpload")
312 (define_insn_reservation "bdver3_ssevector_avx256_unaligned_load" 5
313 (and (eq_attr "cpu" "bdver3,bdver4")
314 (and (eq_attr "type" "ssemov")
315 (and (eq_attr "movu" "1")
316 (and (eq_attr "mode" "V8SF,V4DF")
317 (eq_attr "memory" "load")))))
318 "bdver3-double,bdver3-fpload")
319 (define_insn_reservation "bdver3_ssevector_sse128_unaligned_load" 4
320 (and (eq_attr "cpu" "bdver3,bdver4")
321 (and (eq_attr "type" "ssemov")
322 (and (eq_attr "movu" "1")
323 (and (eq_attr "mode" "V4SF,V2DF")
324 (eq_attr "memory" "load")))))
325 "bdver3-direct,bdver3-fpload,bdver3-fmal")
326 (define_insn_reservation "bdver3_ssevector_avx128_load" 4
327 (and (eq_attr "cpu" "bdver3,bdver4")
328 (and (eq_attr "type" "ssemov")
329 (and (eq_attr "prefix" "vex")
330 (and (eq_attr "mode" "V4SF,V2DF,TI")
331 (eq_attr "memory" "load")))))
332 "bdver3-direct,bdver3-fpload,bdver3-fmal")
333 (define_insn_reservation "bdver3_ssevector_avx256_load" 5
334 (and (eq_attr "cpu" "bdver3,bdver4")
335 (and (eq_attr "type" "ssemov")
336 (and (eq_attr "mode" "V8SF,V4DF,OI")
337 (eq_attr "memory" "load"))))
338 "bdver3-double,bdver3-fpload,bdver3-fmal")
339 (define_insn_reservation "bdver3_ssevector_sse128_load" 4
340 (and (eq_attr "cpu" "bdver3,bdver4")
341 (and (eq_attr "type" "ssemov")
342 (and (eq_attr "mode" "V4SF,V2DF,TI")
343 (eq_attr "memory" "load"))))
344 "bdver3-direct,bdver3-fpload")
345 (define_insn_reservation "bdver3_ssescalar_movq_load" 4
346 (and (eq_attr "cpu" "bdver3,bdver4")
347 (and (eq_attr "type" "ssemov")
348 (and (eq_attr "mode" "DI")
349 (eq_attr "memory" "load"))))
350 "bdver3-direct,bdver3-fpload,bdver3-fmal")
351 (define_insn_reservation "bdver3_ssescalar_vmovss_load" 4
352 (and (eq_attr "cpu" "bdver3,bdver4")
353 (and (eq_attr "type" "ssemov")
354 (and (eq_attr "prefix" "vex")
355 (and (eq_attr "mode" "SF")
356 (eq_attr "memory" "load")))))
357 "bdver3-direct,bdver3-fpload")
358 (define_insn_reservation "bdver3_ssescalar_sse128_load" 4
359 (and (eq_attr "cpu" "bdver3,bdver4")
360 (and (eq_attr "type" "ssemov")
361 (and (eq_attr "mode" "SF,DF")
362 (eq_attr "memory" "load"))))
363 "bdver3-direct,bdver3-fpload, bdver3-ffma")
364 (define_insn_reservation "bdver3_mmxsse_load" 4
365 (and (eq_attr "cpu" "bdver3,bdver4")
366 (and (eq_attr "type" "mmxmov,ssemov")
367 (eq_attr "memory" "load")))
368 "bdver3-direct,bdver3-fpload, bdver3-fmal")
371 (define_insn_reservation "bdver3_sse_store_avx256" 5
372 (and (eq_attr "cpu" "bdver3,bdver4")
373 (and (eq_attr "type" "ssemov")
374 (and (eq_attr "mode" "V8SF,V4DF,OI")
375 (eq_attr "memory" "store,both"))))
376 "bdver3-double,bdver3-fpsched,((bdver3-fsto+bdver3-store)*2)")
377 (define_insn_reservation "bdver3_sse_store" 4
378 (and (eq_attr "cpu" "bdver3,bdver4")
379 (and (eq_attr "type" "ssemov")
380 (and (eq_attr "mode" "V4SF,V2DF,TI")
381 (eq_attr "memory" "store,both"))))
382 "bdver3-direct,bdver3-fpsched,((bdver3-fsto+bdver3-store)*2)")
383 (define_insn_reservation "bdver3_mmxsse_store_short" 4
384 (and (eq_attr "cpu" "bdver3,bdver4")
385 (and (eq_attr "type" "mmxmov,ssemov")
386 (eq_attr "memory" "store,both")))
387 "bdver3-direct,bdver3-fpsched,(bdver3-fsto+bdver3-store)")
390 (define_insn_reservation "bdver3_ssevector_avx256" 3
391 (and (eq_attr "cpu" "bdver3,bdver4")
392 (and (eq_attr "type" "ssemov")
393 (and (eq_attr "mode" "V8SF,V4DF,OI")
394 (eq_attr "memory" "none"))))
395 "bdver3-double,bdver3-fpsched,bdver3-fmal")
396 (define_insn_reservation "bdver3_movss_movsd" 2
397 (and (eq_attr "cpu" "bdver3,bdver4")
398 (and (eq_attr "type" "ssemov")
399 (and (eq_attr "mode" "SF,DF")
400 (eq_attr "memory" "none"))))
401 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
402 (define_insn_reservation "bdver3_mmxssemov" 2
403 (and (eq_attr "cpu" "bdver3,bdver4")
404 (and (eq_attr "type" "mmxmov,ssemov")
405 (eq_attr "memory" "none")))
406 "bdver3-direct,bdver3-fpsched,bdver3-fmal")
408 (define_insn_reservation "bdver3_sselog_load_256" 7
409 (and (eq_attr "cpu" "bdver3,bdver4")
410 (and (eq_attr "type" "sselog,sselog1")
411 (and (eq_attr "mode" "V8SF")
412 (eq_attr "memory" "load"))))
413 "bdver3-double,bdver3-fpload,bdver3-fmal")
414 (define_insn_reservation "bdver3_sselog_256" 3
415 (and (eq_attr "cpu" "bdver3,bdver4")
416 (and (eq_attr "type" "sselog,sselog1")
417 (eq_attr "mode" "V8SF")))
418 "bdver3-double,bdver3-fpsched,bdver3-fmal")
419 (define_insn_reservation "bdver3_sselog_load" 6
420 (and (eq_attr "cpu" "bdver3,bdver4")
421 (and (eq_attr "type" "sselog,sselog1")
422 (eq_attr "memory" "load")))
423 "bdver3-direct,bdver3-fpload,bdver3-fxbar")
424 (define_insn_reservation "bdver3_sselog" 2
425 (and (eq_attr "cpu" "bdver3,bdver4")
426 (eq_attr "type" "sselog,sselog1"))
427 "bdver3-direct,bdver3-fpsched,bdver3-fxbar")
430 (define_insn_reservation "bdver3_sseshuf_load_256" 7
431 (and (eq_attr "cpu" "bdver3,bdver4")
432 (and (eq_attr "type" "sseshuf,sseshuf1")
433 (and (eq_attr "mode" "V8SF")
434 (eq_attr "memory" "load"))))
435 "bdver3-double,bdver3-fpload,bdver3-fpshuf")
436 (define_insn_reservation "bdver3_sseshuf_load" 6
437 (and (eq_attr "cpu" "bdver3,bdver4")
438 (and (eq_attr "type" "sseshuf,sseshuf1")
439 (eq_attr "memory" "load")))
440 "bdver3-direct,bdver3-fpload,bdver3-fpshuf")
442 (define_insn_reservation "bdver3_sseshuf_256" 3
443 (and (eq_attr "cpu" "bdver3,bdver4")
444 (and (eq_attr "type" "sseshuf")
445 (eq_attr "mode" "V8SF")))
446 "bdver3-double,bdver3-fpsched,bdver3-fpshuf")
447 (define_insn_reservation "bdver3_sseshuf" 2
448 (and (eq_attr "cpu" "bdver3,bdver4")
449 (eq_attr "type" "sseshuf,sseshuf1"))
450 "bdver3-direct,bdver3-fpsched,bdver3-fpshuf")
452 ;; PCMP actually executes in FMAL.
453 (define_insn_reservation "bdver3_ssecmp_load" 6
454 (and (eq_attr "cpu" "bdver3,bdver4")
455 (and (eq_attr "type" "ssecmp")
456 (eq_attr "memory" "load")))
457 "bdver3-direct,bdver3-fpload,bdver3-ffma")
458 (define_insn_reservation "bdver3_ssecmp" 2
459 (and (eq_attr "cpu" "bdver3,bdver4")
460 (eq_attr "type" "ssecmp"))
461 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
462 (define_insn_reservation "bdver3_ssecomi_load" 6
463 (and (eq_attr "cpu" "bdver3,bdver4")
464 (and (eq_attr "type" "ssecomi")
465 (eq_attr "memory" "load")))
466 "bdver3-double,bdver3-fpload,(bdver3-ffma | bdver3-fsto)")
467 (define_insn_reservation "bdver3_ssecomi" 2
468 (and (eq_attr "cpu" "bdver3,bdver4")
469 (eq_attr "type" "ssecomi"))
470 "bdver3-double,bdver3-fpsched,(bdver3-ffma | bdver3-fsto)")
472 ;; Conversions behaves very irregularly and the scheduling is critical here.
473 ;; Take each instruction separately.
475 ;; 256 bit conversion.
476 (define_insn_reservation "bdver3_vcvtX2Y_avx256_load" 8
477 (and (eq_attr "cpu" "bdver3,bdver4")
478 (and (eq_attr "type" "ssecvt")
479 (and (eq_attr "memory" "load")
480 (ior (ior (match_operand:V4DF 0 "register_operand")
481 (ior (match_operand:V8SF 0 "register_operand")
482 (match_operand:V8SI 0 "register_operand")))
483 (ior (match_operand:V4DF 1 "nonimmediate_operand")
484 (ior (match_operand:V8SF 1 "nonimmediate_operand")
485 (match_operand:V8SI 1 "nonimmediate_operand")))))))
486 "bdver3-vector,bdver3-fpload,bdver3-fvector")
487 (define_insn_reservation "bdver3_vcvtX2Y_avx256" 4
488 (and (eq_attr "cpu" "bdver3,bdver4")
489 (and (eq_attr "type" "ssecvt")
490 (and (eq_attr "memory" "none")
491 (ior (ior (match_operand:V4DF 0 "register_operand")
492 (ior (match_operand:V8SF 0 "register_operand")
493 (match_operand:V8SI 0 "register_operand")))
494 (ior (match_operand:V4DF 1 "nonimmediate_operand")
495 (ior (match_operand:V8SF 1 "nonimmediate_operand")
496 (match_operand:V8SI 1 "nonimmediate_operand")))))))
497 "bdver3-vector,bdver3-fpsched,bdver3-fvector")
498 ;; CVTSS2SD, CVTSD2SS.
499 (define_insn_reservation "bdver3_ssecvt_cvtss2sd_load" 8
500 (and (eq_attr "cpu" "bdver3,bdver4")
501 (and (eq_attr "type" "ssecvt")
502 (and (eq_attr "mode" "SF,DF")
503 (eq_attr "memory" "load"))))
504 "bdver3-direct,bdver3-fpload,bdver3-fcvt")
505 (define_insn_reservation "bdver3_ssecvt_cvtss2sd" 4
506 (and (eq_attr "cpu" "bdver3,bdver4")
507 (and (eq_attr "type" "ssecvt")
508 (and (eq_attr "mode" "SF,DF")
509 (eq_attr "memory" "none"))))
510 "bdver3-direct,bdver3-fpsched,bdver3-fcvt")
511 ;; CVTSI2SD, CVTSI2SS, CVTSI2SDQ, CVTSI2SSQ.
512 (define_insn_reservation "bdver3_sseicvt_cvtsi2sd_load" 8
513 (and (eq_attr "cpu" "bdver3,bdver4")
514 (and (eq_attr "type" "sseicvt")
515 (and (eq_attr "mode" "SF,DF")
516 (eq_attr "memory" "load"))))
517 "bdver3-direct,bdver3-fpload,bdver3-fcvt")
518 (define_insn_reservation "bdver3_sseicvt_cvtsi2sd" 4
519 (and (eq_attr "cpu" "bdver3,bdver4")
520 (and (eq_attr "type" "sseicvt")
521 (and (eq_attr "mode" "SF,DF")
522 (eq_attr "memory" "none"))))
523 "bdver3-double,bdver3-fpsched,(nothing | bdver3-fcvt)")
525 (define_insn_reservation "bdver3_ssecvt_cvtpd2ps_load" 8
526 (and (eq_attr "cpu" "bdver3,bdver4")
527 (and (eq_attr "type" "ssecvt")
528 (and (eq_attr "memory" "load")
529 (and (match_operand:V4SF 0 "register_operand")
530 (match_operand:V2DF 1 "nonimmediate_operand")))))
531 "bdver3-double,bdver3-fpload,(bdver3-fxbar | bdver3-fcvt)")
532 (define_insn_reservation "bdver3_ssecvt_cvtpd2ps" 4
533 (and (eq_attr "cpu" "bdver3,bdver4")
534 (and (eq_attr "type" "ssecvt")
535 (and (eq_attr "memory" "none")
536 (and (match_operand:V4SF 0 "register_operand")
537 (match_operand:V2DF 1 "nonimmediate_operand")))))
538 "bdver3-double,bdver3-fpsched,(bdver3-fxbar | bdver3-fcvt)")
539 ;; CVTPI2PS, CVTDQ2PS.
540 (define_insn_reservation "bdver3_ssecvt_cvtdq2ps_load" 8
541 (and (eq_attr "cpu" "bdver3,bdver4")
542 (and (eq_attr "type" "ssecvt")
543 (and (eq_attr "memory" "load")
544 (and (match_operand:V4SF 0 "register_operand")
545 (ior (match_operand:V2SI 1 "nonimmediate_operand")
546 (match_operand:V4SI 1 "nonimmediate_operand"))))))
547 "bdver3-direct,bdver3-fpload,bdver3-fcvt")
548 (define_insn_reservation "bdver3_ssecvt_cvtdq2ps" 4
549 (and (eq_attr "cpu" "bdver3,bdver4")
550 (and (eq_attr "type" "ssecvt")
551 (and (eq_attr "memory" "none")
552 (and (match_operand:V4SF 0 "register_operand")
553 (ior (match_operand:V2SI 1 "nonimmediate_operand")
554 (match_operand:V4SI 1 "nonimmediate_operand"))))))
555 "bdver3-direct,bdver3-fpsched,bdver3-fcvt")
557 (define_insn_reservation "bdver3_ssecvt_cvtdq2pd_load" 8
558 (and (eq_attr "cpu" "bdver3,bdver4")
559 (and (eq_attr "type" "ssecvt")
560 (and (eq_attr "memory" "load")
561 (and (match_operand:V2DF 0 "register_operand")
562 (match_operand:V4SI 1 "nonimmediate_operand")))))
563 "bdver3-double,bdver3-fpload,(bdver3-fxbar | bdver3-fcvt)")
564 (define_insn_reservation "bdver3_ssecvt_cvtdq2pd" 4
565 (and (eq_attr "cpu" "bdver3,bdver4")
566 (and (eq_attr "type" "ssecvt")
567 (and (eq_attr "memory" "none")
568 (and (match_operand:V2DF 0 "register_operand")
569 (match_operand:V4SI 1 "nonimmediate_operand")))))
570 "bdver3-double,bdver3-fpsched,(bdver3-fxbar | bdver3-fcvt)")
571 ;; CVTPS2PD, CVTPI2PD.
572 (define_insn_reservation "bdver3_ssecvt_cvtps2pd_load" 6
573 (and (eq_attr "cpu" "bdver3,bdver4")
574 (and (eq_attr "type" "ssecvt")
575 (and (eq_attr "memory" "load")
576 (and (match_operand:V2DF 0 "register_operand")
577 (ior (match_operand:V2SI 1 "nonimmediate_operand")
578 (match_operand:V4SF 1 "nonimmediate_operand"))))))
579 "bdver3-double,bdver3-fpload,(bdver3-fxbar | bdver3-fcvt)")
580 (define_insn_reservation "bdver3_ssecvt_cvtps2pd" 2
581 (and (eq_attr "cpu" "bdver3,bdver4")
582 (and (eq_attr "type" "ssecvt")
583 (and (eq_attr "memory" "load")
584 (and (match_operand:V2DF 0 "register_operand")
585 (ior (match_operand:V2SI 1 "nonimmediate_operand")
586 (match_operand:V4SF 1 "nonimmediate_operand"))))))
587 "bdver3-double,bdver3-fpsched,(bdver3-fxbar | bdver3-fcvt)")
588 ;; CVTSD2SI, CVTSD2SIQ, CVTSS2SI, CVTSS2SIQ, CVTTSD2SI, CVTTSD2SIQ, CVTTSS2SI, CVTTSS2SIQ.
589 (define_insn_reservation "bdver3_ssecvt_cvtsX2si_load" 8
590 (and (eq_attr "cpu" "bdver3,bdver4")
591 (and (eq_attr "type" "sseicvt")
592 (and (eq_attr "mode" "SI,DI")
593 (eq_attr "memory" "load"))))
594 "bdver3-double,bdver3-fpload,(bdver3-fcvt | bdver3-fsto)")
595 (define_insn_reservation "bdver3_ssecvt_cvtsX2si" 4
596 (and (eq_attr "cpu" "bdver3,bdver4")
597 (and (eq_attr "type" "sseicvt")
598 (and (eq_attr "mode" "SI,DI")
599 (eq_attr "memory" "none"))))
600 "bdver3-double,bdver3-fpsched,(bdver3-fcvt | bdver3-fsto)")
601 ;; CVTPD2PI, CVTTPD2PI.
602 (define_insn_reservation "bdver3_ssecvt_cvtpd2pi_load" 8
603 (and (eq_attr "cpu" "bdver3,bdver4")
604 (and (eq_attr "type" "ssecvt")
605 (and (eq_attr "memory" "load")
606 (and (match_operand:V2DF 1 "nonimmediate_operand")
607 (match_operand:V2SI 0 "register_operand")))))
608 "bdver3-double,bdver3-fpload,(bdver3-fcvt | bdver3-fxbar)")
609 (define_insn_reservation "bdver3_ssecvt_cvtpd2pi" 4
610 (and (eq_attr "cpu" "bdver3,bdver4")
611 (and (eq_attr "type" "ssecvt")
612 (and (eq_attr "memory" "none")
613 (and (match_operand:V2DF 1 "nonimmediate_operand")
614 (match_operand:V2SI 0 "register_operand")))))
615 "bdver3-double,bdver3-fpsched,(bdver3-fcvt | bdver3-fxbar)")
616 ;; CVTPD2DQ, CVTTPD2DQ.
617 (define_insn_reservation "bdver3_ssecvt_cvtpd2dq_load" 6
618 (and (eq_attr "cpu" "bdver3,bdver4")
619 (and (eq_attr "type" "ssecvt")
620 (and (eq_attr "memory" "load")
621 (and (match_operand:V2DF 1 "nonimmediate_operand")
622 (match_operand:V4SI 0 "register_operand")))))
623 "bdver3-double,bdver3-fpload,(bdver3-fcvt | bdver3-fxbar)")
624 (define_insn_reservation "bdver3_ssecvt_cvtpd2dq" 2
625 (and (eq_attr "cpu" "bdver3,bdver4")
626 (and (eq_attr "type" "ssecvt")
627 (and (eq_attr "memory" "none")
628 (and (match_operand:V2DF 1 "nonimmediate_operand")
629 (match_operand:V4SI 0 "register_operand")))))
630 "bdver3-double,bdver3-fpsched,(bdver3-fcvt | bdver3-fxbar)")
631 ;; CVTPS2PI, CVTTPS2PI, CVTPS2DQ, CVTTPS2DQ.
632 (define_insn_reservation "bdver3_ssecvt_cvtps2pi_load" 8
633 (and (eq_attr "cpu" "bdver3,bdver4")
634 (and (eq_attr "type" "ssecvt")
635 (and (eq_attr "memory" "load")
636 (and (match_operand:V4SF 1 "nonimmediate_operand")
637 (ior (match_operand: V2SI 0 "register_operand")
638 (match_operand: V4SI 0 "register_operand"))))))
639 "bdver3-direct,bdver3-fpload,bdver3-fcvt")
640 (define_insn_reservation "bdver3_ssecvt_cvtps2pi" 4
641 (and (eq_attr "cpu" "bdver3,bdver4")
642 (and (eq_attr "type" "ssecvt")
643 (and (eq_attr "memory" "none")
644 (and (match_operand:V4SF 1 "nonimmediate_operand")
645 (ior (match_operand: V2SI 0 "register_operand")
646 (match_operand: V4SI 0 "register_operand"))))))
647 "bdver3-direct,bdver3-fpsched,bdver3-fcvt")
649 ;; SSE MUL, ADD, and MULADD.
650 (define_insn_reservation "bdver3_ssemuladd_load_256" 11
651 (and (eq_attr "cpu" "bdver3,bdver4")
652 (and (eq_attr "type" "ssemul,sseadd,sseadd1,ssemuladd")
653 (and (eq_attr "mode" "V8SF,V4DF")
654 (eq_attr "memory" "load"))))
655 "bdver3-double,bdver3-fpload,bdver3-ffma")
656 (define_insn_reservation "bdver3_ssemuladd_256" 7
657 (and (eq_attr "cpu" "bdver3,bdver4")
658 (and (eq_attr "type" "ssemul,sseadd,sseadd1,ssemuladd")
659 (and (eq_attr "mode" "V8SF,V4DF")
660 (eq_attr "memory" "none"))))
661 "bdver3-double,bdver3-fpsched,bdver3-ffma")
662 (define_insn_reservation "bdver3_ssemuladd_load" 10
663 (and (eq_attr "cpu" "bdver3,bdver4")
664 (and (eq_attr "type" "ssemul,sseadd,sseadd1,ssemuladd")
665 (eq_attr "memory" "load")))
666 "bdver3-direct,bdver3-fpload,bdver3-ffma")
667 (define_insn_reservation "bdver3_ssemuladd" 6
668 (and (eq_attr "cpu" "bdver3,bdver4")
669 (and (eq_attr "type" "ssemul,sseadd,sseadd1,ssemuladd")
670 (eq_attr "memory" "none")))
671 "bdver3-direct,bdver3-fpsched,bdver3-ffma")
672 (define_insn_reservation "bdver3_sseimul_load" 8
673 (and (eq_attr "cpu" "bdver3,bdver4")
674 (and (eq_attr "type" "sseimul")
675 (eq_attr "memory" "load")))
676 "bdver3-direct,bdver3-fpload,bdver3-fmma")
677 (define_insn_reservation "bdver3_sseimul" 4
678 (and (eq_attr "cpu" "bdver3,bdver4")
679 (and (eq_attr "type" "sseimul")
680 (eq_attr "memory" "none")))
681 "bdver3-direct,bdver3-fpsched,bdver3-fmma")
682 (define_insn_reservation "bdver3_sseiadd_load" 6
683 (and (eq_attr "cpu" "bdver3,bdver4")
684 (and (eq_attr "type" "sseiadd")
685 (eq_attr "memory" "load")))
686 "bdver3-direct,bdver3-fpload,bdver3-fmal")
687 (define_insn_reservation "bdver3_sseiadd" 2
688 (and (eq_attr "cpu" "bdver3,bdver4")
689 (and (eq_attr "type" "sseiadd")
690 (eq_attr "memory" "none")))
691 "bdver3-direct,bdver3-fpsched,bdver3-fmal")
693 ;; SSE DIV: no throughput information (assume same as amdfam10).
694 (define_insn_reservation "bdver3_ssediv_double_load_256" 27
695 (and (eq_attr "cpu" "bdver3,bdver4")
696 (and (eq_attr "type" "ssediv")
697 (and (eq_attr "mode" "V4DF")
698 (eq_attr "memory" "load"))))
699 "bdver3-double,bdver3-fpload,(bdver3-ffma0*17 | bdver3-ffma1*17)")
700 (define_insn_reservation "bdver3_ssediv_double_256" 27
701 (and (eq_attr "cpu" "bdver3,bdver4")
702 (and (eq_attr "type" "ssediv")
703 (and (eq_attr "mode" "V4DF")
704 (eq_attr "memory" "none"))))
705 "bdver3-double,bdver3-fpsched,(bdver3-ffma0*17 | bdver3-ffma1*17)")
706 (define_insn_reservation "bdver3_ssediv_single_load_256" 27
707 (and (eq_attr "cpu" "bdver3,bdver4")
708 (and (eq_attr "type" "ssediv")
709 (and (eq_attr "mode" "V8SF")
710 (eq_attr "memory" "load"))))
711 "bdver3-double,bdver3-fpload,(bdver3-ffma0*17 | bdver3-ffma1*17)")
712 (define_insn_reservation "bdver3_ssediv_single_256" 24
713 (and (eq_attr "cpu" "bdver3,bdver4")
714 (and (eq_attr "type" "ssediv")
715 (and (eq_attr "mode" "V8SF")
716 (eq_attr "memory" "none"))))
717 "bdver3-double,bdver3-fpsched,(bdver3-ffma0*17 | bdver3-ffma1*17)")
718 (define_insn_reservation "bdver3_ssediv_double_load" 27
719 (and (eq_attr "cpu" "bdver3,bdver4")
720 (and (eq_attr "type" "ssediv")
721 (and (eq_attr "mode" "DF,V2DF")
722 (eq_attr "memory" "load"))))
723 "bdver3-direct,bdver3-fpload,(bdver3-ffma0*17 | bdver3-ffma1*17)")
724 (define_insn_reservation "bdver3_ssediv_double" 27
725 (and (eq_attr "cpu" "bdver3,bdver4")
726 (and (eq_attr "type" "ssediv")
727 (and (eq_attr "mode" "DF,V2DF")
728 (eq_attr "memory" "none"))))
729 "bdver3-direct,bdver3-fpsched,(bdver3-ffma0*17 | bdver3-ffma1*17)")
730 (define_insn_reservation "bdver3_ssediv_single_load" 27
731 (and (eq_attr "cpu" "bdver3,bdver4")
732 (and (eq_attr "type" "ssediv")
733 (and (eq_attr "mode" "SF,V4SF")
734 (eq_attr "memory" "load"))))
735 "bdver3-direct,bdver3-fpload,(bdver3-ffma0*17 | bdver3-ffma1*17)")
736 (define_insn_reservation "bdver3_ssediv_single" 24
737 (and (eq_attr "cpu" "bdver3,bdver4")
738 (and (eq_attr "type" "ssediv")
739 (and (eq_attr "mode" "SF,V4SF")
740 (eq_attr "memory" "none"))))
741 "bdver3-direct,bdver3-fpsched,(bdver3-ffma0*17 | bdver3-ffma1*17)")
743 (define_insn_reservation "bdver3_sseins" 3
744 (and (eq_attr "cpu" "bdver3,bdver4")
745 (and (eq_attr "type" "sseins")
746 (eq_attr "mode" "TI")))
747 "bdver3-direct,bdver3-fpsched,bdver3-fxbar")