1;; Copyright (C) 2012-2018 Free Software Foundation, Inc.
2;;
3;; This file is part of GCC.
4;;
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)
8;; any later version.
9;;
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.
14;;
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/>.
18;;
19
20(define_attr "znver1_decode" "direct,vector,double"
21  (const_string "direct"))
22
23;; AMD znver1 Scheduling
24;; Modeling automatons for zen decoders, integer execution pipes,
25;; AGU pipes and floating point execution units.
26(define_automaton "znver1, znver1_ieu, znver1_fp, znver1_agu")
27
28;; Decoders unit has 4 decoders and all of them can decode fast path
29;; and vector type instructions.
30(define_cpu_unit "znver1-decode0" "znver1")
31(define_cpu_unit "znver1-decode1" "znver1")
32(define_cpu_unit "znver1-decode2" "znver1")
33(define_cpu_unit "znver1-decode3" "znver1")
34
35;; Currently blocking all decoders for vector path instructions as
36;; they are dispatched separetely as microcode sequence.
37;; Fix me: Need to revisit this.
38(define_reservation "znver1-vector" "znver1-decode0+znver1-decode1+znver1-decode2+znver1-decode3")
39
40;; Direct instructions can be issued to any of the four decoders.
41(define_reservation "znver1-direct" "znver1-decode0|znver1-decode1|znver1-decode2|znver1-decode3")
42
43;; Fix me: Need to revisit this later to simulate fast path double behavior.
44(define_reservation "znver1-double" "znver1-direct")
45
46
47;; Integer unit 4 ALU pipes.
48(define_cpu_unit "znver1-ieu0" "znver1_ieu")
49(define_cpu_unit "znver1-ieu1" "znver1_ieu")
50(define_cpu_unit "znver1-ieu2" "znver1_ieu")
51(define_cpu_unit "znver1-ieu3" "znver1_ieu")
52(define_reservation "znver1-ieu" "znver1-ieu0|znver1-ieu1|znver1-ieu2|znver1-ieu3")
53
54;; 2 AGU pipes.
55(define_cpu_unit "znver1-agu0" "znver1_agu")
56(define_cpu_unit "znver1-agu1" "znver1_agu")
57(define_reservation "znver1-agu-reserve" "znver1-agu0|znver1-agu1")
58
59(define_reservation "znver1-load" "znver1-agu-reserve")
60(define_reservation "znver1-store" "znver1-agu-reserve")
61
62;; vectorpath (microcoded) instructions are single issue instructions.
63;; So, they occupy all the integer units.
64(define_reservation "znver1-ivector" "znver1-ieu0+znver1-ieu1
65				      +znver1-ieu2+znver1-ieu3
66				      +znver1-agu0+znver1-agu1")
67
68;; Floating point unit 4 FP pipes.
69(define_cpu_unit "znver1-fp0" "znver1_fp")
70(define_cpu_unit "znver1-fp1" "znver1_fp")
71(define_cpu_unit "znver1-fp2" "znver1_fp")
72(define_cpu_unit "znver1-fp3" "znver1_fp")
73
74(define_reservation "znver1-fpu" "znver1-fp0|znver1-fp1|znver1-fp2|znver1-fp3")
75
76(define_reservation "znver1-fvector" "znver1-fp0+znver1-fp1
77				      +znver1-fp2+znver1-fp3
78				      +znver1-agu0+znver1-agu1")
79
80;; Call instruction
81(define_insn_reservation "znver1_call" 1
82			 (and (eq_attr "cpu" "znver1")
83			      (eq_attr "type" "call,callv"))
84			 "znver1-double,znver1-store,znver1-ieu0|znver1-ieu3")
85
86;; General instructions
87(define_insn_reservation "znver1_push" 1
88			 (and (eq_attr "cpu" "znver1")
89			      (and (eq_attr "type" "push")
90				   (eq_attr "memory" "none,unknown")))
91			 "znver1-direct,znver1-store")
92
93(define_insn_reservation "znver1_push_store" 1
94			 (and (eq_attr "cpu" "znver1")
95			      (and (eq_attr "type" "push")
96				   (eq_attr "memory" "store")))
97			 "znver1-direct,znver1-store")
98
99(define_insn_reservation "znver1_push_both" 5
100			 (and (eq_attr "cpu" "znver1")
101			      (and (eq_attr "type" "push")
102				   (eq_attr "memory" "both")))
103			 "znver1-direct,znver1-load,znver1-store")
104
105(define_insn_reservation "znver1_pop" 4
106			 (and (eq_attr "cpu" "znver1")
107			      (and (eq_attr "type" "pop")
108				   (eq_attr "memory" "load")))
109			 "znver1-direct,znver1-load")
110
111(define_insn_reservation "znver1_pop_mem" 4
112			 (and (eq_attr "cpu" "znver1")
113			      (and (eq_attr "type" "pop")
114				   (eq_attr "memory" "both")))
115			 "znver1-direct,znver1-load,znver1-store")
116
117;; Leave
118(define_insn_reservation "znver1_leave" 1
119			 (and (eq_attr "cpu" "znver1")
120			      (eq_attr "type" "leave"))
121			 "znver1-double,znver1-ieu, znver1-store")
122
123;; Integer Instructions or General instructions
124;; Multiplications
125;; Reg operands
126(define_insn_reservation "znver1_imul" 3
127			 (and (eq_attr "cpu" "znver1")
128			      (and (eq_attr "type" "imul")
129				   (eq_attr "memory" "none")))
130			 "znver1-direct,znver1-ieu1")
131
132(define_insn_reservation "znver1_imul_mem" 7
133			 (and (eq_attr "cpu" "znver1")
134			      (and (eq_attr "type" "imul")
135				   (eq_attr "memory" "!none")))
136			 "znver1-direct,znver1-load, znver1-ieu1")
137
138;; Divisions
139;; Reg operands
140(define_insn_reservation "znver1_idiv_DI" 41
141			 (and (eq_attr "cpu" "znver1")
142			      (and (eq_attr "type" "idiv")
143				   (and (eq_attr "mode" "DI")
144					(eq_attr "memory" "none"))))
145			 "znver1-double,znver1-ieu2*41")
146
147(define_insn_reservation "znver1_idiv_SI" 25
148			 (and (eq_attr "cpu" "znver1")
149			      (and (eq_attr "type" "idiv")
150				   (and (eq_attr "mode" "SI")
151					(eq_attr "memory" "none"))))
152			 "znver1-double,znver1-ieu2*25")
153
154(define_insn_reservation "znver1_idiv_HI" 17
155			 (and (eq_attr "cpu" "znver1")
156			      (and (eq_attr "type" "idiv")
157				   (and (eq_attr "mode" "HI")
158					(eq_attr "memory" "none"))))
159			 "znver1-double,znver1-ieu2*17")
160
161(define_insn_reservation "znver1_idiv_QI" 12
162			 (and (eq_attr "cpu" "znver1")
163			      (and (eq_attr "type" "idiv")
164				   (and (eq_attr "mode" "QI")
165					(eq_attr "memory" "none"))))
166			 "znver1-direct,znver1-ieu2*12")
167
168;; Mem operands
169(define_insn_reservation "znver1_idiv_mem_DI" 45
170			 (and (eq_attr "cpu" "znver1")
171			      (and (eq_attr "type" "idiv")
172				   (and (eq_attr "mode" "DI")
173					(eq_attr "memory" "none"))))
174			 "znver1-double,znver1-load,znver1-ieu2*41")
175
176(define_insn_reservation "znver1_idiv_mem_SI" 29
177			 (and (eq_attr "cpu" "znver1")
178			      (and (eq_attr "type" "idiv")
179				   (and (eq_attr "mode" "SI")
180					(eq_attr "memory" "none"))))
181			 "znver1-double,znver1-load,znver1-ieu2*25")
182
183(define_insn_reservation "znver1_idiv_mem_HI" 21
184			 (and (eq_attr "cpu" "znver1")
185			      (and (eq_attr "type" "idiv")
186				   (and (eq_attr "mode" "HI")
187					(eq_attr "memory" "none"))))
188			 "znver1-double,znver1-load,znver1-ieu2*17")
189
190(define_insn_reservation "znver1_idiv_mem_QI" 16
191			 (and (eq_attr "cpu" "znver1")
192			      (and (eq_attr "type" "idiv")
193				   (and (eq_attr "mode" "QI")
194					(eq_attr "memory" "none"))))
195			 "znver1-direct,znver1-load,znver1-ieu2*12")
196
197;; STR ISHIFT which are micro coded.
198;; Fix me: Latency need to be rechecked.
199(define_insn_reservation "znver1_str_ishift" 6
200			 (and (eq_attr "cpu" "znver1")
201			      (and (eq_attr "type" "str,ishift")
202				   (eq_attr "memory" "both,store")))
203			 "znver1-vector,znver1-ivector")
204;; MOV - integer moves
205(define_insn_reservation "znver1_load_imov_double" 2
206			 (and (eq_attr "cpu" "znver1")
207			      (and (eq_attr "znver1_decode" "double")
208				   (and (eq_attr "type" "imovx")
209					(eq_attr "memory" "none"))))
210			 "znver1-double,znver1-ieu")
211
212(define_insn_reservation "znver1_load_imov_direct" 1
213			 (and (eq_attr "cpu" "znver1")
214			      (and (eq_attr "type" "imov,imovx")
215				   (eq_attr "memory" "none")))
216			 "znver1-direct,znver1-ieu")
217
218(define_insn_reservation "znver1_load_imov_double_store" 2
219			 (and (eq_attr "cpu" "znver1")
220			      (and (eq_attr "znver1_decode" "double")
221				   (and (eq_attr "type" "imovx")
222					(eq_attr "memory" "store"))))
223			 "znver1-double,znver1-ieu,znver1-store")
224
225(define_insn_reservation "znver1_load_imov_direct_store" 1
226			 (and (eq_attr "cpu" "znver1")
227			      (and (eq_attr "type" "imov,imovx")
228				   (eq_attr "memory" "store")))
229				   "znver1-direct,znver1-ieu,znver1-store")
230
231(define_insn_reservation "znver1_load_imov_double_load" 5
232			 (and (eq_attr "cpu" "znver1")
233			      (and (eq_attr "znver1_decode" "double")
234				   (and (eq_attr "type" "imovx")
235					(eq_attr "memory" "load"))))
236			 "znver1-double,znver1-load")
237
238(define_insn_reservation "znver1_load_imov_direct_load" 4
239			 (and (eq_attr "cpu" "znver1")
240			      (and (eq_attr "type" "imov,imovx")
241				   (eq_attr "memory" "load")))
242			 "znver1-direct,znver1-load")
243
244;; INTEGER/GENERAL instructions
245;; register/imm operands only: ALU, ICMP, NEG, NOT, ROTATE, ISHIFT, TEST
246(define_insn_reservation "znver1_insn" 1
247			 (and (eq_attr "cpu" "znver1")
248			      (and (eq_attr "type" "alu,icmp,negnot,rotate,rotate1,ishift,ishift1,test,setcc,incdec,icmov")
249				   (eq_attr "memory" "none,unknown")))
250			 "znver1-direct,znver1-ieu")
251
252(define_insn_reservation "znver1_insn_load" 5
253			 (and (eq_attr "cpu" "znver1")
254			      (and (eq_attr "type" "alu,icmp,negnot,rotate,rotate1,ishift,ishift1,test,setcc,incdec,icmov")
255				   (eq_attr "memory" "load")))
256			 "znver1-direct,znver1-load,znver1-ieu")
257
258(define_insn_reservation "znver1_insn_store" 1
259			 (and (eq_attr "cpu" "znver1")
260			      (and (eq_attr "type" "alu,icmp,negnot,rotate,rotate1,ishift1,test,setcc,incdec")
261				   (eq_attr "memory" "store")))
262			 "znver1-direct,znver1-ieu,znver1-store")
263
264(define_insn_reservation "znver1_insn_both" 5
265			 (and (eq_attr "cpu" "znver1")
266			      (and (eq_attr "type" "alu,icmp,negnot,rotate,rotate1,ishift1,test,setcc,incdec")
267				   (eq_attr "memory" "both")))
268			 "znver1-direct,znver1-load,znver1-ieu,znver1-store")
269
270;; Fix me: Other vector type insns keeping latency 6 as of now.
271(define_insn_reservation "znver1_ieu_vector" 6
272			 (and (eq_attr "cpu" "znver1")
273			      (eq_attr "type" "other,str,multi"))
274			 "znver1-vector,znver1-ivector")
275
276;; ALU1 register operands.
277(define_insn_reservation "znver1_alu1_vector" 3
278			 (and (eq_attr "cpu" "znver1")
279			      (and (eq_attr "znver1_decode" "vector")
280				   (and (eq_attr "type" "alu1")
281					(eq_attr "memory" "none,unknown"))))
282			 "znver1-vector,znver1-ivector")
283
284(define_insn_reservation "znver1_alu1_double" 2
285			 (and (eq_attr "cpu" "znver1")
286			      (and (eq_attr "znver1_decode" "double")
287				   (and (eq_attr "type" "alu1")
288					(eq_attr "memory" "none,unknown"))))
289			 "znver1-double,znver1-ieu")
290
291(define_insn_reservation "znver1_alu1_direct" 1
292			 (and (eq_attr "cpu" "znver1")
293			      (and (eq_attr "znver1_decode" "direct")
294				   (and (eq_attr "type" "alu1")
295					(eq_attr "memory" "none,unknown"))))
296			 "znver1-direct,znver1-ieu")
297
298;; Branches : Fix me need to model conditional branches.
299(define_insn_reservation "znver1_branch" 1
300			 (and (eq_attr "cpu" "znver1")
301			      (and (eq_attr "type" "ibr")
302				   (eq_attr "memory" "none")))
303			  "znver1-direct")
304
305;; Indirect branches check latencies.
306(define_insn_reservation "znver1_indirect_branch_mem" 6
307			 (and (eq_attr "cpu" "znver1")
308			      (and (eq_attr "type" "ibr")
309				   (eq_attr "memory" "load")))
310			 "znver1-vector,znver1-ivector")
311
312;; LEA executes in ALU units with 1 cycle latency.
313(define_insn_reservation "znver1_lea" 1
314			 (and (eq_attr "cpu" "znver1")
315			      (eq_attr "type" "lea"))
316			 "znver1-direct,znver1-ieu")
317
318;; Other integer instrucions
319(define_insn_reservation "znver1_idirect" 1
320			 (and (eq_attr "cpu" "znver1")
321			      (and (eq_attr "unit" "integer,unknown")
322				   (eq_attr "memory" "none,unknown")))
323			 "znver1-direct,znver1-ieu")
324
325;;  Floating point
326(define_insn_reservation "znver1_fp_cmov" 6
327			 (and (eq_attr "cpu" "znver1")
328			      (eq_attr "type" "fcmov"))
329			 "znver1-vector,znver1-fvector")
330
331(define_insn_reservation "znver1_fp_mov_direct_load" 8
332			 (and (eq_attr "cpu" "znver1")
333			      (and (eq_attr "znver1_decode" "direct")
334				   (and (eq_attr "type" "fmov")
335					(eq_attr "memory" "load"))))
336			 "znver1-direct,znver1-load,znver1-fp3|znver1-fp1")
337
338(define_insn_reservation "znver1_fp_mov_direct_store" 5
339			 (and (eq_attr "cpu" "znver1")
340			      (and (eq_attr "znver1_decode" "direct")
341				   (and (eq_attr "type" "fmov")
342					(eq_attr "memory" "store"))))
343			 "znver1-direct,znver1-fp2|znver1-fp3,znver1-store")
344
345(define_insn_reservation "znver1_fp_mov_double" 4
346			 (and (eq_attr "cpu" "znver1")
347			      (and (eq_attr "znver1_decode" "double")
348				   (and (eq_attr "type" "fmov")
349					(eq_attr "memory" "none"))))
350			 "znver1-double,znver1-fp3")
351
352(define_insn_reservation "znver1_fp_mov_double_load" 12
353			 (and (eq_attr "cpu" "znver1")
354			      (and (eq_attr "znver1_decode" "double")
355				   (and (eq_attr "type" "fmov")
356					(eq_attr "memory" "load"))))
357			 "znver1-double,znver1-load,znver1-fp3")
358
359(define_insn_reservation "znver1_fp_mov_direct" 1
360			 (and (eq_attr "cpu" "znver1")
361			      (eq_attr "type" "fmov"))
362			 "znver1-direct,znver1-fp3")
363
364(define_insn_reservation "znver1_fp_spc_direct" 5
365			 (and (eq_attr "cpu" "znver1")
366			      (and (eq_attr "type" "fpspc")
367				   (eq_attr "memory" "store")))
368			 "znver1-direct,znver1-fp3,znver1-fp2")
369
370(define_insn_reservation "znver1_fp_insn_vector" 6
371			 (and (eq_attr "cpu" "znver1")
372			      (and (eq_attr "znver1_decode" "vector")
373				   (eq_attr "type" "fpspc,mmxcvt,sselog1,ssemul,ssemov")))
374			 "znver1-vector,znver1-fvector")
375
376;; FABS
377(define_insn_reservation "znver1_fp_fsgn" 1
378			 (and (eq_attr "cpu" "znver1")
379			      (eq_attr "type" "fsgn"))
380			 "znver1-direct,znver1-fp3")
381
382(define_insn_reservation "znver1_fp_fcmp" 2
383			 (and (eq_attr "cpu" "znver1")
384			      (and (eq_attr "memory" "none")
385				   (and (eq_attr "znver1_decode" "double")
386					(eq_attr "type" "fcmp"))))
387			 "znver1-double,znver1-fp0,znver1-fp2")
388
389(define_insn_reservation "znver1_fp_fcmp_load" 9
390			 (and (eq_attr "cpu" "znver1")
391			      (and (eq_attr "memory" "none")
392				   (and (eq_attr "znver1_decode" "double")
393					(eq_attr "type" "fcmp"))))
394			 "znver1-double,znver1-load, znver1-fp0,znver1-fp2")
395
396;;FADD FSUB FMUL
397(define_insn_reservation "znver1_fp_op_mul" 5
398			 (and (eq_attr "cpu" "znver1")
399			      (and (eq_attr "type" "fop,fmul")
400				   (eq_attr "memory" "none")))
401			 "znver1-direct,znver1-fp0*5")
402
403(define_insn_reservation "znver1_fp_op_mul_load" 12
404			 (and (eq_attr "cpu" "znver1")
405			      (and (eq_attr "type" "fop,fmul")
406				   (eq_attr "memory" "load")))
407			 "znver1-direct,znver1-load,znver1-fp0*5")
408
409(define_insn_reservation "znver1_fp_op_imul_load" 16
410			 (and (eq_attr "cpu" "znver1")
411			      (and (eq_attr "type" "fop,fmul")
412				   (and (eq_attr "fp_int_src" "true")
413					(eq_attr "memory" "load"))))
414			"znver1-double,znver1-load,znver1-fp3,znver1-fp0")
415
416(define_insn_reservation "znver1_fp_op_div" 15
417			 (and (eq_attr "cpu" "znver1")
418			      (and (eq_attr "type" "fdiv")
419				   (eq_attr "memory" "none")))
420			 "znver1-direct,znver1-fp3*15")
421
422(define_insn_reservation "znver1_fp_op_div_load" 22
423			 (and (eq_attr "cpu" "znver1")
424			      (and (eq_attr "type" "fdiv")
425				   (eq_attr "memory" "load")))
426			 "znver1-direct,znver1-load,znver1-fp3*15")
427
428(define_insn_reservation "znver1_fp_op_idiv_load" 27
429			 (and (eq_attr "cpu" "znver1")
430			      (and (eq_attr "type" "fdiv")
431				   (and (eq_attr "fp_int_src" "true")
432					(eq_attr "memory" "load"))))
433			 "znver1-double,znver1-load,znver1-fp3*19")
434
435;; MMX, SSE, SSEn.n, AVX, AVX2 instructions
436(define_insn_reservation "znver1_fp_insn" 1
437			 (and (eq_attr "cpu" "znver1")
438			      (eq_attr "type" "mmx"))
439			 "znver1-direct,znver1-fpu")
440
441(define_insn_reservation "znver1_mmx_add" 1
442			 (and (eq_attr "cpu" "znver1")
443			      (and (eq_attr "type" "mmxadd")
444				   (eq_attr "memory" "none")))
445			 "znver1-direct,znver1-fp0|znver1-fp1|znver1-fp3")
446
447(define_insn_reservation "znver1_mmx_add_load" 8
448			 (and (eq_attr "cpu" "znver1")
449			      (and (eq_attr "type" "mmxadd")
450				   (eq_attr "memory" "load")))
451			 "znver1-direct,znver1-load,znver1-fp0|znver1-fp1|znver1-fp3")
452
453(define_insn_reservation "znver1_mmx_cmp" 1
454			 (and (eq_attr "cpu" "znver1")
455			      (and (eq_attr "type" "mmxcmp")
456				   (eq_attr "memory" "none")))
457			 "znver1-direct,znver1-fp0|znver1-fp3")
458
459(define_insn_reservation "znver1_mmx_cmp_load" 8
460			 (and (eq_attr "cpu" "znver1")
461			      (and (eq_attr "type" "mmxcmp")
462				   (eq_attr "memory" "load")))
463			 "znver1-direct,znver1-load,znver1-fp0|znver1-fp3")
464
465(define_insn_reservation "znver1_mmx_cvt_pck_shuf" 1
466			 (and (eq_attr "cpu" "znver1")
467			      (and (eq_attr "type" "mmxcvt,sseshuf,sseshuf1")
468				   (eq_attr "memory" "none")))
469			 "znver1-direct,znver1-fp1|znver1-fp2")
470
471(define_insn_reservation "znver1_mmx_cvt_pck_shuf_load" 8
472			 (and (eq_attr "cpu" "znver1")
473			      (and (eq_attr "type" "mmxcvt,sseshuf,sseshuf1")
474				   (eq_attr "memory" "load")))
475			 "znver1-direct,znver1-load,znver1-fp1|znver1-fp2")
476
477(define_insn_reservation "znver1_mmx_shift_move" 1
478			 (and (eq_attr "cpu" "znver1")
479			      (and (eq_attr "type" "mmxshft,mmxmov")
480				   (eq_attr "memory" "none")))
481 			 "znver1-direct,znver1-fp2")
482
483(define_insn_reservation "znver1_mmx_shift_move_load" 8
484			 (and (eq_attr "cpu" "znver1")
485			      (and (eq_attr "type" "mmxshft,mmxmov")
486				   (eq_attr "memory" "load")))
487			 "znver1-direct,znver1-load,znver1-fp2")
488
489(define_insn_reservation "znver1_mmx_move_store" 1
490			 (and (eq_attr "cpu" "znver1")
491			      (and (eq_attr "type" "mmxshft,mmxmov")
492				   (eq_attr "memory" "store,both")))
493			  "znver1-direct,znver1-fp2,znver1-store")
494
495(define_insn_reservation "znver1_mmx_mul" 3
496			 (and (eq_attr "cpu" "znver1")
497			      (and (eq_attr "type" "mmxmul")
498				   (eq_attr "memory" "none")))
499			  "znver1-direct,znver1-fp0*3")
500
501(define_insn_reservation "znver1_mmx_load" 10
502			 (and (eq_attr "cpu" "znver1")
503			      (and (eq_attr "type" "mmxmul")
504				   (eq_attr "memory" "load")))
505			 "znver1-direct,znver1-load,znver1-fp0*3")
506
507(define_insn_reservation "znver1_avx256_log" 1
508			 (and (eq_attr "cpu" "znver1")
509			      (and (eq_attr "mode" "V8SF,V4DF,OI")
510 				   (and (eq_attr "type" "sselog")
511					(eq_attr "memory" "none"))))
512			 "znver1-double,znver1-fpu")
513
514(define_insn_reservation "znver1_avx256_log_load" 8
515			 (and (eq_attr "cpu" "znver1")
516			      (and (eq_attr "mode" "V8SF,V4DF,OI")
517				   (and (eq_attr "type" "sselog")
518					(eq_attr "memory" "load"))))
519			 "znver1-double,znver1-load,znver1-fpu")
520
521(define_insn_reservation "znver1_sse_log" 1
522			 (and (eq_attr "cpu" "znver1")
523			      (and (eq_attr "type" "sselog")
524				   (eq_attr "memory" "none")))
525			 "znver1-direct,znver1-fpu")
526
527(define_insn_reservation "znver1_sse_log_load" 8
528			 (and (eq_attr "cpu" "znver1")
529			      (and (eq_attr "type" "sselog")
530				   (eq_attr "memory" "load")))
531			 "znver1-direct,znver1-load,znver1-fpu")
532
533(define_insn_reservation "znver1_avx256_log1" 1
534			 (and (eq_attr "cpu" "znver1")
535			      (and (eq_attr "mode" "V8SF,V4DF,OI")
536				   (and (eq_attr "type" "sselog1")
537					(eq_attr "memory" "none"))))
538			 "znver1-double,znver1-fp1|znver1-fp2")
539
540(define_insn_reservation "znver1_avx256_log1_load" 8
541			 (and (eq_attr "cpu" "znver1")
542			      (and (eq_attr "mode" "V8SF,V4DF,OI")
543				   (and (eq_attr "type" "sselog1")
544					(eq_attr "memory" "!none"))))
545			 "znver1-double,znver1-load,znver1-fp1|znver1-fp2")
546
547(define_insn_reservation "znver1_sse_log1" 1
548			 (and (eq_attr "cpu" "znver1")
549			      (and (eq_attr "type" "sselog1")
550				   (eq_attr "memory" "none")))
551			 "znver1-direct,znver1-fp1|znver1-fp2")
552
553(define_insn_reservation "znver1_sse_log1_load" 8
554			 (and (eq_attr "cpu" "znver1")
555			      (and (eq_attr "type" "sselog1")
556				   (eq_attr "memory" "!none")))
557			 "znver1-direct,znver1-load,znver1-fp1|znver1-fp2")
558
559(define_insn_reservation "znver1_sse_comi" 1
560			 (and (eq_attr "cpu" "znver1")
561			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF")
562				   (and (eq_attr "prefix" "!vex")
563					(and (eq_attr "prefix_extra" "0")
564					     (and (eq_attr "type" "ssecomi")
565						  (eq_attr "memory" "none"))))))
566			 "znver1-direct,znver1-fp0|znver1-fp1")
567
568(define_insn_reservation "znver1_sse_comi_load" 8
569			 (and (eq_attr "cpu" "znver1")
570			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF")
571				   (and (eq_attr "prefix" "!vex")
572					(and (eq_attr "prefix_extra" "0")
573					     (and (eq_attr "type" "ssecomi")
574						  (eq_attr "memory" "load"))))))
575			 "znver1-direct,znver1-load,znver1-fp0|znver1-fp1")
576
577(define_insn_reservation "znver1_sse_comi_double" 2
578			 (and (eq_attr "cpu" "znver1")
579			      (and (eq_attr "mode" "V4SF,V2DF,TI")
580				   (and (eq_attr "prefix" "vex")
581					(and (eq_attr "prefix_extra" "0")
582					     (and (eq_attr "type" "ssecomi")
583						  (eq_attr "memory" "none"))))))
584			 "znver1-double,znver1-fp0|znver1-fp1")
585
586(define_insn_reservation "znver1_sse_comi_double_load" 10
587			 (and (eq_attr "cpu" "znver1")
588			      (and (eq_attr "mode" "V4SF,V2DF,TI")
589				   (and (eq_attr "prefix" "vex")
590					(and (eq_attr "prefix_extra" "0")
591					     (and (eq_attr "type" "ssecomi")
592						  (eq_attr "memory" "load"))))))
593			 "znver1-double,znver1-load,znver1-fp0|znver1-fp1")
594
595(define_insn_reservation "znver1_sse_test" 1
596			 (and (eq_attr "cpu" "znver1")
597			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF,TI")
598				   (and (eq_attr "prefix_extra" "1")
599					(and (eq_attr "type" "ssecomi")
600					     (eq_attr "memory" "none")))))
601			 "znver1-direct,znver1-fp1|znver1-fp2")
602
603(define_insn_reservation "znver1_sse_test_load" 8
604			 (and (eq_attr "cpu" "znver1")
605			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF,TI")
606				   (and (eq_attr "prefix_extra" "1")
607					(and (eq_attr "type" "ssecomi")
608					     (eq_attr "memory" "load")))))
609			 "znver1-direct,znver1-load,znver1-fp1|znver1-fp2")
610
611;; SSE moves
612;; Fix me:  Need to revist this again some of the moves may be restricted
613;; to some fpu pipes.
614(define_insn_reservation "znver1_sse_mov" 2
615			 (and (eq_attr "cpu" "znver1")
616			      (and (eq_attr "mode" "SI")
617				   (and (eq_attr "isa" "avx")
618					(and (eq_attr "type" "ssemov")
619					     (eq_attr "memory" "none")))))
620			 "znver1-direct,znver1-ieu0")
621
622(define_insn_reservation "znver1_avx_mov" 2
623			 (and (eq_attr "cpu" "znver1")
624			      (and (eq_attr "mode" "TI")
625				   (and (eq_attr "isa" "avx")
626					(and (eq_attr "type" "ssemov")
627					     (and (match_operand:SI 1 "register_operand")
628						  (eq_attr "memory" "none"))))))
629			 "znver1-direct,znver1-ieu2")
630
631(define_insn_reservation "znver1_sseavx_mov" 1
632			 (and (eq_attr "cpu" "znver1")
633			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF,TI")
634				   (and (eq_attr "type" "ssemov")
635					(eq_attr "memory" "none"))))
636			 "znver1-direct,znver1-fpu")
637
638(define_insn_reservation "znver1_sseavx_mov_store" 1
639			 (and (eq_attr "cpu" "znver1")
640			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF,TI")
641				   (and (eq_attr "type" "ssemov")
642					(eq_attr "memory" "store"))))
643			"znver1-direct,znver1-fpu,znver1-store")
644
645(define_insn_reservation "znver1_sseavx_mov_load" 8
646			 (and (eq_attr "cpu" "znver1")
647			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF,TI")
648				   (and (eq_attr "type" "ssemov")
649					(eq_attr "memory" "load"))))
650			 "znver1-direct,znver1-load,znver1-fpu")
651
652(define_insn_reservation "znver1_avx256_mov" 1
653			 (and (eq_attr "cpu" "znver1")
654			      (and (eq_attr "mode" "V8SF,V4DF,OI")
655				   (and (eq_attr "type" "ssemov")
656					(eq_attr "memory" "none"))))
657			 "znver1-double,znver1-fpu")
658
659(define_insn_reservation "znver1_avx256_mov_store" 1
660			 (and (eq_attr "cpu" "znver1")
661			      (and (eq_attr "mode" "V8SF,V4DF,OI")
662				   (and (eq_attr "type" "ssemov")
663					(eq_attr "memory" "store"))))
664			 "znver1-double,znver1-fpu,znver1-store")
665
666(define_insn_reservation "znver1_avx256_mov_load" 8
667			 (and (eq_attr "cpu" "znver1")
668			      (and (eq_attr "mode" "V8SF,V4DF,OI")
669				   (and (eq_attr "type" "ssemov")
670					(eq_attr "memory" "load"))))
671			 "znver1-double,znver1-load,znver1-fpu")
672
673;; SSE add
674(define_insn_reservation "znver1_sseavx_add" 3
675			 (and (eq_attr "cpu" "znver1")
676			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF,TI")
677				   (and (eq_attr "type" "sseadd")
678					(eq_attr "memory" "none"))))
679			 "znver1-direct,znver1-fp2|znver1-fp3")
680
681(define_insn_reservation "znver1_sseavx_add_load" 10
682			 (and (eq_attr "cpu" "znver1")
683			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF,TI")
684				   (and (eq_attr "type" "sseadd")
685					(eq_attr "memory" "load"))))
686			 "znver1-direct,znver1-load,znver1-fp2|znver1-fp3")
687
688(define_insn_reservation "znver1_avx256_add" 3
689			 (and (eq_attr "cpu" "znver1")
690			      (and (eq_attr "mode" "V8SF,V4DF,OI")
691				   (and (eq_attr "type" "sseadd")
692					(eq_attr "memory" "none"))))
693			 "znver1-double,znver1-fp2|znver1-fp3")
694
695(define_insn_reservation "znver1_avx256_add_load" 10
696			 (and (eq_attr "cpu" "znver1")
697			      (and (eq_attr "mode" "V8SF,V4DF,OI")
698				   (and (eq_attr "type" "sseadd")
699					(eq_attr "memory" "load"))))
700			 "znver1-double,znver1-load,znver1-fp2|znver1-fp3")
701
702(define_insn_reservation "znver1_sseavx_fma" 5
703			 (and (eq_attr "cpu" "znver1")
704			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF")
705				   (and (eq_attr "type" "ssemuladd")
706					(eq_attr "memory" "none"))))
707			 "znver1-direct,znver1-fp0|znver1-fp1")
708
709(define_insn_reservation "znver1_sseavx_fma_load" 12
710			 (and (eq_attr "cpu" "znver1")
711			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF")
712				   (and (eq_attr "type" "ssemuladd")
713					(eq_attr "memory" "load"))))
714			"znver1-direct,znver1-load,znver1-fp0|znver1-fp1")
715
716(define_insn_reservation "znver1_avx256_fma" 5
717			 (and (eq_attr "cpu" "znver1")
718			      (and (eq_attr "mode" "V8SF,V4DF")
719				   (and (eq_attr "type" "ssemuladd")
720					(eq_attr "memory" "none"))))
721			 "znver1-double,znver1-fp0|znver1-fp1")
722
723(define_insn_reservation "znver1_avx256_fma_load" 12
724			 (and (eq_attr "cpu" "znver1")
725			      (and (eq_attr "mode" "V8SF,V4DF")
726				   (and (eq_attr "type" "ssemuladd")
727					(eq_attr "memory" "load"))))
728			 "znver1-double,znver1-load,znver1-fp0|znver1-fp1")
729
730(define_insn_reservation "znver1_sseavx_iadd" 1
731			 (and (eq_attr "cpu" "znver1")
732			      (and (eq_attr "mode" "DI,TI")
733				   (and (eq_attr "type" "sseiadd")
734					(eq_attr "memory" "none"))))
735			 "znver1-direct,znver1-fp0|znver1-fp1|znver1-fp3")
736
737(define_insn_reservation "znver1_sseavx_iadd_load" 8
738			 (and (eq_attr "cpu" "znver1")
739			      (and (eq_attr "mode" "DI,TI")
740				   (and (eq_attr "type" "sseiadd")
741					(eq_attr "memory" "load"))))
742			 "znver1-direct,znver1-load,znver1-fp0|znver1-fp1|znver1-fp3")
743
744(define_insn_reservation "znver1_avx256_iadd" 1
745			 (and (eq_attr "cpu" "znver1")
746			      (and (eq_attr "mode" "OI")
747				   (and (eq_attr "type" "sseiadd")
748					(eq_attr "memory" "none"))))
749			 "znver1-double,znver1-fp0|znver1-fp1|znver1-fp3")
750
751(define_insn_reservation "znver1_avx256_iadd_load" 8
752			 (and (eq_attr "cpu" "znver1")
753			      (and (eq_attr "mode" "OI")
754				   (and (eq_attr "type" "sseiadd")
755					(eq_attr "memory" "load"))))
756			 "znver1-double,znver1-load,znver1-fp0|znver1-fp1|znver1-fp3")
757
758;; SSE conversions.
759(define_insn_reservation "znver1_ssecvtsf_si_load" 12
760			 (and (eq_attr "cpu" "znver1")
761			      (and (eq_attr "mode" "SI")
762				   (and (eq_attr "type" "sseicvt")
763					(and (match_operand:SF 1 "memory_operand")
764					     (eq_attr "memory" "load")))))
765			 "znver1-double,znver1-load,znver1-fp3,znver1-ieu0")
766
767(define_insn_reservation "znver1_ssecvtdf_si" 5
768			 (and (eq_attr "cpu" "znver1")
769			      (and (eq_attr "mode" "SI")
770				   (and (match_operand:DF 1 "register_operand")
771					(and (eq_attr "type" "sseicvt")
772					     (eq_attr "memory" "none")))))
773			 "znver1-double,znver1-fp3,znver1-ieu0")
774
775(define_insn_reservation "znver1_ssecvtdf_si_load" 12
776			 (and (eq_attr "cpu" "znver1")
777			      (and (eq_attr "mode" "SI")
778				   (and (eq_attr "type" "sseicvt")
779					(and (match_operand:DF 1 "memory_operand")
780					     (eq_attr "memory" "load")))))
781			 "znver1-double,znver1-load,znver1-fp3,znver1-ieu0")
782
783;; All other used ssecvt fp3 pipes
784;; Check: Need to revisit this again.
785;; Some SSE converts may use different pipe combinations.
786(define_insn_reservation "znver1_ssecvt" 4
787			 (and (eq_attr "cpu" "znver1")
788			      (and (eq_attr "type" "ssecvt")
789				   (eq_attr "memory" "none")))
790			 "znver1-direct,znver1-fp3")
791
792(define_insn_reservation "znver1_ssecvt_load" 11
793			 (and (eq_attr "cpu" "znver1")
794			      (and (eq_attr "type" "ssecvt")
795				   (eq_attr "memory" "load")))
796			 "znver1-direct,znver1-load,znver1-fp3")
797
798;; SSE div
799(define_insn_reservation "znver1_ssediv_ss_ps" 10
800			 (and (eq_attr "cpu" "znver1")
801			      (and (eq_attr "mode" "V4SF,SF")
802				   (and (eq_attr "type" "ssediv")
803					(eq_attr "memory" "none"))))
804			 "znver1-direct,znver1-fp3*10")
805
806(define_insn_reservation "znver1_ssediv_ss_ps_load" 17
807			 (and (eq_attr "cpu" "znver1")
808			      (and (eq_attr "mode" "V4SF,SF")
809				   (and (eq_attr "type" "ssediv")
810			 		(eq_attr "memory" "load"))))
811			 "znver1-direct,znver1-load,znver1-fp3*10")
812
813(define_insn_reservation "znver1_ssediv_sd_pd" 13
814			 (and (eq_attr "cpu" "znver1")
815			      (and (eq_attr "mode" "V2DF,DF")
816				   (and (eq_attr "type" "ssediv")
817					(eq_attr "memory" "none"))))
818			 "znver1-direct,znver1-fp3*13")
819
820(define_insn_reservation "znver1_ssediv_sd_pd_load" 20
821			 (and (eq_attr "cpu" "znver1")
822			      (and (eq_attr "mode" "V2DF,DF")
823				   (and (eq_attr "type" "ssediv")
824					(eq_attr "memory" "load"))))
825			 "znver1-direct,znver1-load,znver1-fp3*13")
826
827(define_insn_reservation "znver1_ssediv_avx256_ps" 12
828			 (and (eq_attr "cpu" "znver1")
829			      (and (eq_attr "mode" "V8SF")
830				   (and (eq_attr "memory" "none")
831					(eq_attr "type" "ssediv"))))
832			 "znver1-double,znver1-fp3*12")
833
834(define_insn_reservation "znver1_ssediv_avx256_ps_load" 19
835			 (and (eq_attr "cpu" "znver1")
836			      (and (eq_attr "mode" "V8SF")
837				   (and (eq_attr "type" "ssediv")
838					(eq_attr "memory" "load"))))
839			 "znver1-double,znver1-load,znver1-fp3*12")
840
841(define_insn_reservation "znver1_ssediv_avx256_pd" 15
842			 (and (eq_attr "cpu" "znver1")
843			      (and (eq_attr "mode" "V4DF")
844				   (and (eq_attr "type" "ssediv")
845					(eq_attr "memory" "none"))))
846			 "znver1-double,znver1-fp3*15")
847
848(define_insn_reservation "znver1_ssediv_avx256_pd_load" 22
849			 (and (eq_attr "cpu" "znver1")
850			      (and (eq_attr "mode" "V4DF")
851				   (and (eq_attr "type" "ssediv")
852					(eq_attr "memory" "load"))))
853			 "znver1-double,znver1-load,znver1-fp3*15")
854;; SSE MUL
855(define_insn_reservation "znver1_ssemul_ss_ps" 3
856			 (and (eq_attr "cpu" "znver1")
857			      (and (eq_attr "mode" "V4SF,SF")
858				   (and (eq_attr "type" "ssemul")
859					(eq_attr "memory" "none"))))
860			 "znver1-direct,(znver1-fp0|znver1-fp1)*3")
861
862(define_insn_reservation "znver1_ssemul_ss_ps_load" 10
863			 (and (eq_attr "cpu" "znver1")
864			      (and (eq_attr "mode" "V4SF,SF")
865				   (and (eq_attr "type" "ssemul")
866					(eq_attr "memory" "load"))))
867			 "znver1-direct,znver1-load,(znver1-fp0|znver1-fp1)*3")
868
869(define_insn_reservation "znver1_ssemul_avx256_ps" 3
870			 (and (eq_attr "cpu" "znver1")
871			      (and (eq_attr "mode" "V8SF")
872				   (and (eq_attr "type" "ssemul")
873					(eq_attr "memory" "none"))))
874			 "znver1-double,(znver1-fp0|znver1-fp1)*3")
875
876(define_insn_reservation "znver1_ssemul_avx256_ps_load" 10
877			 (and (eq_attr "cpu" "znver1")
878			      (and (eq_attr "mode" "V8SF")
879				   (and (eq_attr "type" "ssemul")
880					(eq_attr "memory" "load"))))
881			 "znver1-double,znver1-load,(znver1-fp0|znver1-fp1)*3")
882
883(define_insn_reservation "znver1_ssemul_sd_pd" 4
884			 (and (eq_attr "cpu" "znver1")
885			      (and (eq_attr "mode" "V2DF,DF")
886				   (and (eq_attr "type" "ssemul")
887					(eq_attr "memory" "none"))))
888			 "znver1-direct,(znver1-fp0|znver1-fp1)*4")
889
890(define_insn_reservation "znver1_ssemul_sd_pd_load" 11
891			 (and (eq_attr "cpu" "znver1")
892			      (and (eq_attr "mode" "V2DF,DF")
893				   (and (eq_attr "type" "ssemul")
894					(eq_attr "memory" "load"))))
895			 "znver1-direct,znver1-load,(znver1-fp0|znver1-fp1)*4")
896
897(define_insn_reservation "znver1_ssemul_avx256_pd" 5
898			 (and (eq_attr "cpu" "znver1")
899			      (and (eq_attr "mode" "V4DF")
900				   (and (eq_attr "mode" "V4DF")
901					(and (eq_attr "type" "ssemul")
902					     (eq_attr "memory" "none")))))
903			 "znver1-double,(znver1-fp0|znver1-fp1)*4")
904
905(define_insn_reservation "znver1_ssemul_avx256_pd_load" 12
906			 (and (eq_attr "cpu" "znver1")
907			      (and (eq_attr "mode" "V4DF")
908				   (and (eq_attr "type" "ssemul")
909					(eq_attr "memory" "load"))))
910			 "znver1-double,znver1-load,(znver1-fp0|znver1-fp1)*4")
911
912;;SSE imul
913(define_insn_reservation "znver1_sseimul" 3
914			 (and (eq_attr "cpu" "znver1")
915			      (and (eq_attr "mode" "TI")
916				   (and (eq_attr "type" "sseimul")
917					(eq_attr "memory" "none"))))
918			 "znver1-direct,znver1-fp0*3")
919
920(define_insn_reservation "znver1_sseimul_avx256" 4
921			 (and (eq_attr "cpu" "znver1")
922			      (and (eq_attr "mode" "OI")
923				   (and (eq_attr "type" "sseimul")
924					(eq_attr "memory" "none"))))
925			 "znver1-double,znver1-fp0*4")
926
927(define_insn_reservation "znver1_sseimul_load" 10
928			 (and (eq_attr "cpu" "znver1")
929			      (and (eq_attr "mode" "TI")
930				   (and (eq_attr "type" "sseimul")
931					(eq_attr "memory" "load"))))
932			 "znver1-direct,znver1-load,znver1-fp0*3")
933
934(define_insn_reservation "znver1_sseimul_avx256_load" 11
935			 (and (eq_attr "cpu" "znver1")
936			      (and (eq_attr "mode" "OI")
937				   (and (eq_attr "type" "sseimul")
938					(eq_attr "memory" "load"))))
939			 "znver1-double,znver1-load,znver1-fp0*4")
940
941(define_insn_reservation "znver1_sseimul_di" 3
942			 (and (eq_attr "cpu" "znver1")
943			      (and (eq_attr "mode" "DI")
944				   (and (eq_attr "memory" "none")
945					(eq_attr "type" "sseimul"))))
946			 "znver1-direct,znver1-fp0*3")
947
948(define_insn_reservation "znver1_sseimul_load_di" 10
949			 (and (eq_attr "cpu" "znver1")
950			      (and (eq_attr "mode" "DI")
951				   (and (eq_attr "type" "sseimul")
952					(eq_attr "memory" "load"))))
953			 "znver1-direct,znver1-load,znver1-fp0*3")
954
955;; SSE compares
956(define_insn_reservation "znver1_sse_cmp" 1
957			 (and (eq_attr "cpu" "znver1")
958			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF")
959				   (and (eq_attr "type" "ssecmp")
960					(eq_attr "memory" "none"))))
961			 "znver1-direct,znver1-fp0|znver1-fp1")
962
963(define_insn_reservation "znver1_sse_cmp_load" 8
964			 (and (eq_attr "cpu" "znver1")
965			      (and (eq_attr "mode" "SF,DF,V4SF,V2DF")
966				   (and (eq_attr "type" "ssecmp")
967					(eq_attr "memory" "load"))))
968			 "znver1-direct,znver1-load,znver1-fp0|znver1-fp1")
969
970(define_insn_reservation "znver1_sse_cmp_avx256" 1
971			 (and (eq_attr "cpu" "znver1")
972			      (and (eq_attr "mode" "V8SF,V4DF")
973				   (and (eq_attr "type" "ssecmp")
974					(eq_attr "memory" "none"))))
975			"znver1-double,znver1-fp0|znver1-fp1")
976
977(define_insn_reservation "znver1_sse_cmp_avx256_load" 8
978			 (and (eq_attr "cpu" "znver1")
979			      (and (eq_attr "mode" "V8SF,V4DF")
980				   (and (eq_attr "type" "ssecmp")
981					(eq_attr "memory" "load"))))
982			 "znver1-double,znver1-load,znver1-fp0|znver1-fp1")
983
984(define_insn_reservation "znver1_sse_icmp" 1
985			 (and (eq_attr "cpu" "znver1")
986			      (and (eq_attr "mode" "QI,HI,SI,DI,TI")
987				   (and (eq_attr "type" "ssecmp")
988					(eq_attr "memory" "none"))))
989			 "znver1-direct,znver1-fp0|znver1-fp3")
990
991(define_insn_reservation "znver1_sse_icmp_load" 8
992			 (and (eq_attr "cpu" "znver1")
993			      (and (eq_attr "mode" "QI,HI,SI,DI,TI")
994				   (and (eq_attr "type" "ssecmp")
995					(eq_attr "memory" "load"))))
996			 "znver1-direct,znver1-load,znver1-fp0|znver1-fp3")
997
998(define_insn_reservation "znver1_sse_icmp_avx256" 1
999			 (and (eq_attr "cpu" "znver1")
1000			      (and (eq_attr "mode" "OI")
1001				   (and (eq_attr "type" "ssecmp")
1002					(eq_attr "memory" "none"))))
1003			 "znver1-double,znver1-fp0|znver1-fp3")
1004
1005(define_insn_reservation "znver1_sse_icmp_avx256_load" 8
1006			 (and (eq_attr "cpu" "znver1")
1007			      (and (eq_attr "mode" "OI")
1008				   (and (eq_attr "type" "ssecmp")
1009					(eq_attr "memory" "load"))))
1010			 "znver1-double,znver1-load,znver1-fp0|znver1-fp3")
1011