1;; Copyright (C) 2002-2022 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;; AMD Athlon Scheduling
20;;
21;; The Athlon does contain three pipelined FP units, three integer units and
22;; three address generation units.
23;;
24;; The predecode logic is determining boundaries of instructions in the 64
25;; byte cache line. So the cache line straddling problem of K6 might be issue
26;; here as well, but it is not noted in the documentation.
27;;
28;; Three DirectPath instructions decoders and only one VectorPath decoder
29;; is available. They can decode three DirectPath instructions or one VectorPath
30;; instruction per cycle.
31;; Decoded macro instructions are then passed to 72 entry instruction control
32;; unit, that passes
33;; it to the specialized integer (18 entry) and fp (36 entry) schedulers.
34;;
35;; The load/store queue unit is not attached to the schedulers but
36;; communicates with all the execution units separately instead.
37
38(define_attr "athlon_decode" "direct,vector,double"
39  (cond [(eq_attr "type" "call,imul,idiv,other,multi,fcmov,fpspc,str,pop,leave")
40             (const_string "vector")
41         (and (eq_attr "type" "push")
42              (match_operand 1 "memory_operand"))
43             (const_string "vector")
44         (and (eq_attr "type" "fmov")
45                (and (eq_attr "memory" "load,store")
46                       (eq_attr "mode" "XF")))
47             (const_string "vector")]
48          (const_string "direct")))
49
50(define_attr "amdfam10_decode" "direct,vector,double"
51  (const_string "direct"))
52;;
53;;           decode0 decode1 decode2
54;;                 \    |   /
55;;    instruction control unit (72 entry scheduler)
56;;                |                        |
57;;      integer scheduler (18)         stack map
58;;     /  |    |    |    |   \        stack rename
59;;  ieu0 agu0 ieu1 agu1 ieu2 agu2      scheduler
60;;    |  agu0  |   agu1      agu2    register file
61;;    |      \ |    |       /         |     |     |
62;;     \      /\    |     /         fadd  fmul  fstore
63;;       \  /    \  |   /           fadd  fmul  fstore
64;;       imul  load/store (2x)      fadd  fmul  fstore
65
66(define_automaton "athlon,athlon_load,athlon_mult,athlon_fp")
67(define_cpu_unit "athlon-decode0" "athlon")
68(define_cpu_unit "athlon-decode1" "athlon")
69(define_cpu_unit "athlon-decode2" "athlon")
70(define_cpu_unit "athlon-decodev" "athlon")
71;; Model the fact that double decoded instruction may take 2 cycles
72;; to decode when decoder2 and decoder0 in next cycle
73;; is used (this is needed to allow troughput of 1.5 double decoded
74;; instructions per cycle).
75;;
76;; In order to avoid dependence between reservation of decoder
77;; and other units, we model decoder as two stage fully pipelined unit
78;; and only double decoded instruction may occupy unit in the first cycle.
79;; With this scheme however two double instructions can be issued cycle0.
80;;
81;; Avoid this by using presence set requiring decoder0 to be allocated
82;; too. Vector decoded instructions then can't be issued when
83;; modeled as consuming decoder0+decoder1+decoder2.
84;; We solve that by specialized vector decoder unit and exclusion set.
85(presence_set "athlon-decode2" "athlon-decode0")
86(exclusion_set "athlon-decodev" "athlon-decode0,athlon-decode1,athlon-decode2")
87(define_reservation "athlon-vector" "nothing,athlon-decodev")
88(define_reservation "athlon-direct0" "nothing,athlon-decode0")
89(define_reservation "athlon-direct" "nothing,
90                                             (athlon-decode0 | athlon-decode1
91                                             | athlon-decode2)")
92;; Double instructions behaves like two direct instructions.
93(define_reservation "athlon-double" "((athlon-decode2, athlon-decode0)
94                                             | (nothing,(athlon-decode0 + athlon-decode1))
95                                             | (nothing,(athlon-decode1 + athlon-decode2)))")
96
97;; Agu and ieu unit results in extremely large automatons and
98;; in our approximation they are hardly filled in.  Only ieu
99;; unit can, as issue rate is 3 and agu unit is always used
100;; first in the insn reservations.  Skip the models.
101
102;(define_cpu_unit "athlon-ieu0" "athlon_ieu")
103;(define_cpu_unit "athlon-ieu1" "athlon_ieu")
104;(define_cpu_unit "athlon-ieu2" "athlon_ieu")
105;(define_reservation "athlon-ieu" "(athlon-ieu0 | athlon-ieu1 | athlon-ieu2)")
106(define_reservation "athlon-ieu" "nothing")
107(define_cpu_unit "athlon-ieu0" "athlon")
108;(define_cpu_unit "athlon-agu0" "athlon_agu")
109;(define_cpu_unit "athlon-agu1" "athlon_agu")
110;(define_cpu_unit "athlon-agu2" "athlon_agu")
111;(define_reservation "athlon-agu" "(athlon-agu0 | athlon-agu1 | athlon-agu2)")
112(define_reservation "athlon-agu" "nothing")
113
114(define_cpu_unit "athlon-mult" "athlon_mult")
115
116(define_cpu_unit "athlon-load0" "athlon_load")
117(define_cpu_unit "athlon-load1" "athlon_load")
118(define_reservation "athlon-load" "athlon-agu,
119                                           (athlon-load0 | athlon-load1),nothing")
120;; 128bit SSE instructions issue two loads at once
121(define_reservation "athlon-load2" "athlon-agu,
122                                           (athlon-load0 + athlon-load1),nothing")
123
124(define_reservation "athlon-store" "(athlon-load0 | athlon-load1)")
125;; 128bit SSE instructions issue two stores at once
126(define_reservation "athlon-store2" "(athlon-load0 + athlon-load1)")
127
128
129;; The FP operations start to execute at stage 12 in the pipeline, while
130;; integer operations start to execute at stage 9 for Athlon and 11 for K8
131;; Compensate the difference for Athlon because it results in significantly
132;; smaller automata.
133(define_reservation "athlon-fpsched" "nothing,nothing,nothing")
134;; The floating point loads.
135(define_reservation "athlon-fpload" "(athlon-fpsched + athlon-load)")
136(define_reservation "athlon-fpload2" "(athlon-fpsched + athlon-load2)")
137(define_reservation "athlon-fploadk8" "(athlon-fpsched + athlon-load)")
138(define_reservation "athlon-fpload2k8" "(athlon-fpsched + athlon-load2)")
139
140
141;; The three fp units are fully pipelined with latency of 3
142(define_cpu_unit "athlon-fadd" "athlon_fp")
143(define_cpu_unit "athlon-fmul" "athlon_fp")
144(define_cpu_unit "athlon-fstore" "athlon_fp")
145(define_reservation "athlon-fany" "(athlon-fstore | athlon-fmul | athlon-fadd)")
146(define_reservation "athlon-faddmul" "(athlon-fadd | athlon-fmul)")
147
148;; Vector operations usually consume many of pipes.
149(define_reservation "athlon-fvector" "(athlon-fadd + athlon-fmul + athlon-fstore)")
150
151
152;; Jump instructions are executed in the branch unit completely transparent to us
153(define_insn_reservation "athlon_branch" 0
154                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
155                                    (eq_attr "type" "ibr"))
156                               "athlon-direct,athlon-ieu")
157(define_insn_reservation "athlon_call" 0
158                               (and (eq_attr "cpu" "athlon,k8")
159                                    (eq_attr "type" "call,callv"))
160                               "athlon-vector,athlon-ieu")
161(define_insn_reservation "athlon_call_amdfam10" 0
162                               (and (eq_attr "cpu" "amdfam10")
163                                    (eq_attr "type" "call,callv"))
164                               "athlon-double,athlon-ieu")
165
166;; Latency of push operation is 3 cycles, but ESP value is available
167;; earlier
168(define_insn_reservation "athlon_push" 2
169                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
170                                    (eq_attr "type" "push"))
171                               "athlon-direct,athlon-agu,athlon-store")
172(define_insn_reservation "athlon_pop" 4
173                               (and (eq_attr "cpu" "athlon,k8")
174                                    (eq_attr "type" "pop"))
175                               "athlon-vector,athlon-load,athlon-ieu")
176(define_insn_reservation "athlon_pop_k8" 3
177                               (and (eq_attr "cpu" "k8")
178                                    (eq_attr "type" "pop"))
179                               "athlon-double,(athlon-ieu+athlon-load)")
180(define_insn_reservation "athlon_pop_amdfam10" 3
181                               (and (eq_attr "cpu" "amdfam10")
182                                    (eq_attr "type" "pop"))
183                               "athlon-direct,(athlon-ieu+athlon-load)")
184(define_insn_reservation "athlon_leave" 3
185                               (and (eq_attr "cpu" "athlon")
186                                    (eq_attr "type" "leave"))
187                               "athlon-vector,(athlon-ieu+athlon-load)")
188(define_insn_reservation "athlon_leave_k8" 3
189                               (and (eq_attr "cpu" "k8,amdfam10")
190                                    (eq_attr "type" "leave"))
191                               "athlon-double,(athlon-ieu+athlon-load)")
192
193;; Lea executes in AGU unit with 2 cycles latency.
194(define_insn_reservation "athlon_lea" 2
195                               (and (eq_attr "cpu" "athlon,k8")
196                                    (eq_attr "type" "lea"))
197                               "athlon-direct,athlon-agu,nothing")
198;; Lea executes in AGU unit with 1 cycle latency on AMDFAM10
199(define_insn_reservation "athlon_lea_amdfam10" 1
200                               (and (eq_attr "cpu" "amdfam10")
201                                    (eq_attr "type" "lea"))
202                               "athlon-direct,athlon-agu,nothing")
203
204;; Mul executes in special multiplier unit attached to IEU0
205(define_insn_reservation "athlon_imul" 5
206                               (and (eq_attr "cpu" "athlon")
207                                    (and (eq_attr "type" "imul")
208                                           (eq_attr "memory" "none,unknown")))
209                               "athlon-vector,athlon-ieu0,athlon-mult,nothing,nothing,athlon-ieu0")
210;; ??? Widening multiply is vector or double.
211(define_insn_reservation "athlon_imul_k8_DI" 4
212                               (and (eq_attr "cpu" "k8,amdfam10")
213                                    (and (eq_attr "type" "imul")
214                                           (and (eq_attr "mode" "DI")
215                                                  (eq_attr "memory" "none,unknown"))))
216                               "athlon-direct0,athlon-ieu0,athlon-mult,nothing,athlon-ieu0")
217(define_insn_reservation "athlon_imul_k8" 3
218                               (and (eq_attr "cpu" "k8,amdfam10")
219                                    (and (eq_attr "type" "imul")
220                                           (eq_attr "memory" "none,unknown")))
221                               "athlon-direct0,athlon-ieu0,athlon-mult,athlon-ieu0")
222(define_insn_reservation "athlon_imul_amdfam10_HI" 4
223                               (and (eq_attr "cpu" "amdfam10")
224                                    (and (eq_attr "type" "imul")
225                                           (and (eq_attr "mode" "HI")
226                                                  (eq_attr "memory" "none,unknown"))))
227                               "athlon-vector,athlon-ieu0,athlon-mult,nothing,athlon-ieu0")
228(define_insn_reservation "athlon_imul_mem" 8
229                               (and (eq_attr "cpu" "athlon")
230                                    (and (eq_attr "type" "imul")
231                                           (eq_attr "memory" "load,both")))
232                               "athlon-vector,athlon-load,athlon-ieu,athlon-mult,nothing,nothing,athlon-ieu")
233(define_insn_reservation "athlon_imul_mem_k8_DI" 7
234                               (and (eq_attr "cpu" "k8,amdfam10")
235                                    (and (eq_attr "type" "imul")
236                                           (and (eq_attr "mode" "DI")
237                                                  (eq_attr "memory" "load,both"))))
238                               "athlon-vector,athlon-load,athlon-ieu,athlon-mult,nothing,athlon-ieu")
239(define_insn_reservation "athlon_imul_mem_k8" 6
240                               (and (eq_attr "cpu" "k8,amdfam10")
241                                    (and (eq_attr "type" "imul")
242                                           (eq_attr "memory" "load,both")))
243                               "athlon-vector,athlon-load,athlon-ieu,athlon-mult,athlon-ieu")
244
245;; Idiv cannot execute in parallel with other instructions.  Dealing with it
246;; as with short latency vector instruction is good approximation avoiding
247;; scheduler from trying too hard to can hide it's latency by overlap with
248;; other instructions.
249;; ??? Experiments show that the idiv can overlap with roughly 6 cycles
250;; of the other code
251;; Using the same heuristics for amdfam10 as K8 with idiv
252
253(define_insn_reservation "athlon_idiv" 6
254                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
255                                    (and (eq_attr "type" "idiv")
256                                           (eq_attr "memory" "none,unknown")))
257                               "athlon-vector,(athlon-ieu0*6+(athlon-fpsched,athlon-fvector))")
258(define_insn_reservation "athlon_idiv_mem" 9
259                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
260                                    (and (eq_attr "type" "idiv")
261                                           (eq_attr "memory" "load,both")))
262                               "athlon-vector,((athlon-load,athlon-ieu0*6)+(athlon-fpsched,athlon-fvector))")
263;; The parallelism of string instructions is not documented.  Model it same way
264;; as idiv to create smaller automata.  This probably does not matter much.
265;; Using the same heuristics for amdfam10 as K8 with idiv
266(define_insn_reservation "athlon_str" 6
267                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
268                                    (and (eq_attr "type" "str")
269                                           (eq_attr "memory" "load,both,store")))
270                               "athlon-vector,athlon-load,athlon-ieu0*6")
271
272(define_insn_reservation "athlon_idirect" 1
273                               (and (eq_attr "cpu" "athlon,k8")
274                                    (and (eq_attr "athlon_decode" "direct")
275                                           (and (eq_attr "unit" "integer,unknown")
276                                                  (eq_attr "memory" "none,unknown"))))
277                               "athlon-direct,athlon-ieu")
278(define_insn_reservation "athlon_idirect_amdfam10" 1
279                               (and (eq_attr "cpu" "amdfam10")
280                                    (and (eq_attr "amdfam10_decode" "direct")
281                                           (and (eq_attr "unit" "integer,unknown")
282                                                  (eq_attr "memory" "none,unknown"))))
283                               "athlon-direct,athlon-ieu")
284(define_insn_reservation "athlon_ivector" 2
285                               (and (eq_attr "cpu" "athlon,k8")
286                                    (and (eq_attr "athlon_decode" "vector")
287                                           (and (eq_attr "unit" "integer,unknown")
288                                                  (eq_attr "memory" "none,unknown"))))
289                               "athlon-vector,athlon-ieu,athlon-ieu")
290(define_insn_reservation "athlon_ivector_amdfam10" 2
291                               (and (eq_attr "cpu" "amdfam10")
292                                    (and (eq_attr "amdfam10_decode" "vector")
293                                           (and (eq_attr "unit" "integer,unknown")
294                                                  (eq_attr "memory" "none,unknown"))))
295                               "athlon-vector,athlon-ieu,athlon-ieu")
296
297(define_insn_reservation "athlon_idirect_loadmov" 3
298                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
299                                    (and (eq_attr "type" "imov")
300                                           (eq_attr "memory" "load")))
301                               "athlon-direct,athlon-load")
302
303(define_insn_reservation "athlon_idirect_load" 4
304                               (and (eq_attr "cpu" "athlon,k8")
305                                    (and (eq_attr "athlon_decode" "direct")
306                                           (and (eq_attr "unit" "integer,unknown")
307                                                  (eq_attr "memory" "load"))))
308                               "athlon-direct,athlon-load,athlon-ieu")
309(define_insn_reservation "athlon_idirect_load_amdfam10" 4
310                               (and (eq_attr "cpu" "amdfam10")
311                                    (and (eq_attr "amdfam10_decode" "direct")
312                                           (and (eq_attr "unit" "integer,unknown")
313                                                  (eq_attr "memory" "load"))))
314                               "athlon-direct,athlon-load,athlon-ieu")
315(define_insn_reservation "athlon_ivector_load" 6
316                               (and (eq_attr "cpu" "athlon,k8")
317                                    (and (eq_attr "athlon_decode" "vector")
318                                           (and (eq_attr "unit" "integer,unknown")
319                                                  (eq_attr "memory" "load"))))
320                               "athlon-vector,athlon-load,athlon-ieu,athlon-ieu")
321(define_insn_reservation "athlon_ivector_load_amdfam10" 6
322                               (and (eq_attr "cpu" "amdfam10")
323                                    (and (eq_attr "amdfam10_decode" "vector")
324                                           (and (eq_attr "unit" "integer,unknown")
325                                                  (eq_attr "memory" "load"))))
326                               "athlon-vector,athlon-load,athlon-ieu,athlon-ieu")
327
328(define_insn_reservation "athlon_idirect_movstore" 1
329                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
330                                    (and (eq_attr "type" "imov")
331                                           (eq_attr "memory" "store")))
332                               "athlon-direct,athlon-agu,athlon-store")
333
334(define_insn_reservation "athlon_idirect_both" 4
335                               (and (eq_attr "cpu" "athlon,k8")
336                                    (and (eq_attr "athlon_decode" "direct")
337                                           (and (eq_attr "unit" "integer,unknown")
338                                                  (eq_attr "memory" "both"))))
339                               "athlon-direct,athlon-load,
340                                athlon-ieu,athlon-store,
341                                athlon-store")
342(define_insn_reservation "athlon_idirect_both_amdfam10" 4
343                               (and (eq_attr "cpu" "amdfam10")
344                                    (and (eq_attr "amdfam10_decode" "direct")
345                                           (and (eq_attr "unit" "integer,unknown")
346                                                  (eq_attr "memory" "both"))))
347                               "athlon-direct,athlon-load,
348                                athlon-ieu,athlon-store,
349                                athlon-store")
350
351(define_insn_reservation "athlon_ivector_both" 6
352                               (and (eq_attr "cpu" "athlon,k8")
353                                    (and (eq_attr "athlon_decode" "vector")
354                                           (and (eq_attr "unit" "integer,unknown")
355                                                  (eq_attr "memory" "both"))))
356                               "athlon-vector,athlon-load,
357                                athlon-ieu,
358                                athlon-ieu,
359                                athlon-store")
360(define_insn_reservation "athlon_ivector_both_amdfam10" 6
361                               (and (eq_attr "cpu" "amdfam10")
362                                    (and (eq_attr "amdfam10_decode" "vector")
363                                           (and (eq_attr "unit" "integer,unknown")
364                                                  (eq_attr "memory" "both"))))
365                               "athlon-vector,athlon-load,
366                                athlon-ieu,
367                                athlon-ieu,
368                                athlon-store")
369
370(define_insn_reservation "athlon_idirect_store" 1
371                               (and (eq_attr "cpu" "athlon,k8")
372                                    (and (eq_attr "athlon_decode" "direct")
373                                           (and (eq_attr "unit" "integer,unknown")
374                                                  (eq_attr "memory" "store"))))
375                               "athlon-direct,(athlon-ieu+athlon-agu),
376                                athlon-store")
377(define_insn_reservation "athlon_idirect_store_amdfam10" 1
378                               (and (eq_attr "cpu" "amdfam10")
379                                    (and (eq_attr "amdfam10_decode" "direct")
380                                           (and (eq_attr "unit" "integer,unknown")
381                                                  (eq_attr "memory" "store"))))
382                               "athlon-direct,(athlon-ieu+athlon-agu),
383                                athlon-store")
384
385(define_insn_reservation "athlon_ivector_store" 2
386                               (and (eq_attr "cpu" "athlon,k8")
387                                    (and (eq_attr "athlon_decode" "vector")
388                                           (and (eq_attr "unit" "integer,unknown")
389                                                  (eq_attr "memory" "store"))))
390                               "athlon-vector,(athlon-ieu+athlon-agu),athlon-ieu,
391                                athlon-store")
392(define_insn_reservation "athlon_ivector_store_amdfam10" 2
393                               (and (eq_attr "cpu" "amdfam10")
394                                    (and (eq_attr "amdfam10_decode" "vector")
395                                           (and (eq_attr "unit" "integer,unknown")
396                                                  (eq_attr "memory" "store"))))
397                               "athlon-vector,(athlon-ieu+athlon-agu),athlon-ieu,
398                                athlon-store")
399
400;; Athlon floatin point unit
401(define_insn_reservation "athlon_fldxf" 12
402                               (and (eq_attr "cpu" "athlon")
403                                    (and (eq_attr "type" "fmov")
404                                           (and (eq_attr "memory" "load")
405                                                  (eq_attr "mode" "XF"))))
406                               "athlon-vector,athlon-fpload2,athlon-fvector*9")
407(define_insn_reservation "athlon_fldxf_k8" 13
408                               (and (eq_attr "cpu" "k8,amdfam10")
409                                    (and (eq_attr "type" "fmov")
410                                           (and (eq_attr "memory" "load")
411                                                  (eq_attr "mode" "XF"))))
412                               "athlon-vector,athlon-fpload2k8,athlon-fvector*9")
413;; Assume superforwarding to take place so effective latency of fany op is 0.
414(define_insn_reservation "athlon_fld" 0
415                               (and (eq_attr "cpu" "athlon")
416                                    (and (eq_attr "type" "fmov")
417                                           (eq_attr "memory" "load")))
418                               "athlon-direct,athlon-fpload,athlon-fany")
419(define_insn_reservation "athlon_fld_k8" 2
420                               (and (eq_attr "cpu" "k8,amdfam10")
421                                    (and (eq_attr "type" "fmov")
422                                           (eq_attr "memory" "load")))
423                               "athlon-direct,athlon-fploadk8,athlon-fstore")
424
425(define_insn_reservation "athlon_fstxf" 10
426                               (and (eq_attr "cpu" "athlon")
427                                    (and (eq_attr "type" "fmov")
428                                           (and (eq_attr "memory" "store,both")
429                                                  (eq_attr "mode" "XF"))))
430                               "athlon-vector,(athlon-fpsched+athlon-agu),(athlon-store2+(athlon-fvector*7))")
431(define_insn_reservation "athlon_fstxf_k8" 8
432                               (and (eq_attr "cpu" "k8,amdfam10")
433                                    (and (eq_attr "type" "fmov")
434                                           (and (eq_attr "memory" "store,both")
435                                                  (eq_attr "mode" "XF"))))
436                               "athlon-vector,(athlon-fpsched+athlon-agu),(athlon-store2+(athlon-fvector*6))")
437(define_insn_reservation "athlon_fst" 4
438                               (and (eq_attr "cpu" "athlon")
439                                    (and (eq_attr "type" "fmov")
440                                           (eq_attr "memory" "store,both")))
441                               "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
442(define_insn_reservation "athlon_fst_k8" 2
443                               (and (eq_attr "cpu" "k8,amdfam10")
444                                    (and (eq_attr "type" "fmov")
445                                           (eq_attr "memory" "store,both")))
446                               "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
447(define_insn_reservation "athlon_fist" 4
448                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
449                                    (eq_attr "type" "fistp,fisttp"))
450                               "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
451(define_insn_reservation "athlon_fmov" 2
452                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
453                                    (eq_attr "type" "fmov"))
454                               "athlon-direct,athlon-fpsched,athlon-faddmul")
455(define_insn_reservation "athlon_fadd_load" 4
456                               (and (eq_attr "cpu" "athlon")
457                                    (and (eq_attr "type" "fop")
458                                           (eq_attr "memory" "load")))
459                               "athlon-direct,athlon-fpload,athlon-fadd")
460(define_insn_reservation "athlon_fadd_load_k8" 6
461                               (and (eq_attr "cpu" "k8,amdfam10")
462                                    (and (eq_attr "type" "fop")
463                                           (eq_attr "memory" "load")))
464                               "athlon-direct,athlon-fploadk8,athlon-fadd")
465(define_insn_reservation "athlon_fadd" 4
466                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
467                                    (eq_attr "type" "fop"))
468                               "athlon-direct,athlon-fpsched,athlon-fadd")
469(define_insn_reservation "athlon_fmul_load" 4
470                               (and (eq_attr "cpu" "athlon")
471                                    (and (eq_attr "type" "fmul")
472                                           (eq_attr "memory" "load")))
473                               "athlon-direct,athlon-fpload,athlon-fmul")
474(define_insn_reservation "athlon_fmul_load_k8" 6
475                               (and (eq_attr "cpu" "k8,amdfam10")
476                                    (and (eq_attr "type" "fmul")
477                                           (eq_attr "memory" "load")))
478                               "athlon-direct,athlon-fploadk8,athlon-fmul")
479(define_insn_reservation "athlon_fmul" 4
480                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
481                                    (eq_attr "type" "fmul"))
482                               "athlon-direct,athlon-fpsched,athlon-fmul")
483(define_insn_reservation "athlon_fsgn" 2
484                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
485                                    (eq_attr "type" "fsgn"))
486                               "athlon-direct,athlon-fpsched,athlon-fmul")
487(define_insn_reservation "athlon_fdiv_load" 24
488                               (and (eq_attr "cpu" "athlon")
489                                    (and (eq_attr "type" "fdiv")
490                                           (eq_attr "memory" "load")))
491                               "athlon-direct,athlon-fpload,athlon-fmul")
492(define_insn_reservation "athlon_fdiv_load_k8" 13
493                               (and (eq_attr "cpu" "k8,amdfam10")
494                                    (and (eq_attr "type" "fdiv")
495                                           (eq_attr "memory" "load")))
496                               "athlon-direct,athlon-fploadk8,athlon-fmul")
497(define_insn_reservation "athlon_fdiv" 24
498                               (and (eq_attr "cpu" "athlon")
499                                    (eq_attr "type" "fdiv"))
500                               "athlon-direct,athlon-fpsched,athlon-fmul")
501(define_insn_reservation "athlon_fdiv_k8" 11
502                               (and (eq_attr "cpu" "k8,amdfam10")
503                                    (eq_attr "type" "fdiv"))
504                               "athlon-direct,athlon-fpsched,athlon-fmul")
505(define_insn_reservation "athlon_fpspc_load" 103
506                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
507                                    (and (eq_attr "type" "fpspc")
508                                           (eq_attr "memory" "load")))
509                               "athlon-vector,athlon-fpload,athlon-fvector")
510(define_insn_reservation "athlon_fpspc" 100
511                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
512                                    (eq_attr "type" "fpspc"))
513                               "athlon-vector,athlon-fpsched,athlon-fvector")
514(define_insn_reservation "athlon_fcmov_load" 7
515                               (and (eq_attr "cpu" "athlon")
516                                    (and (eq_attr "type" "fcmov")
517                                           (eq_attr "memory" "load")))
518                               "athlon-vector,athlon-fpload,athlon-fvector")
519(define_insn_reservation "athlon_fcmov" 7
520                               (and (eq_attr "cpu" "athlon")
521                                    (eq_attr "type" "fcmov"))
522                               "athlon-vector,athlon-fpsched,athlon-fvector")
523(define_insn_reservation "athlon_fcmov_load_k8" 17
524                               (and (eq_attr "cpu" "k8,amdfam10")
525                                    (and (eq_attr "type" "fcmov")
526                                           (eq_attr "memory" "load")))
527                               "athlon-vector,athlon-fploadk8,athlon-fvector")
528(define_insn_reservation "athlon_fcmov_k8" 15
529                               (and (eq_attr "cpu" "k8,amdfam10")
530                                    (eq_attr "type" "fcmov"))
531                               "athlon-vector,athlon-fpsched,athlon-fvector")
532;; fcomi is vector decoded by uses only one pipe.
533(define_insn_reservation "athlon_fcomi_load" 3
534                               (and (eq_attr "cpu" "athlon")
535                                    (and (eq_attr "type" "fcmp")
536                                           (and (eq_attr "athlon_decode" "vector")
537                                                (eq_attr "memory" "load"))))
538                               "athlon-vector,athlon-fpload,athlon-fadd")
539(define_insn_reservation "athlon_fcomi_load_k8" 5
540                               (and (eq_attr "cpu" "k8,amdfam10")
541                                    (and (eq_attr "type" "fcmp")
542                                           (and (eq_attr "athlon_decode" "vector")
543                                                (eq_attr "memory" "load"))))
544                               "athlon-vector,athlon-fploadk8,athlon-fadd")
545(define_insn_reservation "athlon_fcomi" 3
546                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
547                                    (and (eq_attr "athlon_decode" "vector")
548                                           (eq_attr "type" "fcmp")))
549                               "athlon-vector,athlon-fpsched,athlon-fadd")
550(define_insn_reservation "athlon_fcom_load" 2
551                               (and (eq_attr "cpu" "athlon")
552                                    (and (eq_attr "type" "fcmp")
553                                           (eq_attr "memory" "load")))
554                               "athlon-direct,athlon-fpload,athlon-fadd")
555(define_insn_reservation "athlon_fcom_load_k8" 4
556                               (and (eq_attr "cpu" "k8,amdfam10")
557                                    (and (eq_attr "type" "fcmp")
558                                           (eq_attr "memory" "load")))
559                               "athlon-direct,athlon-fploadk8,athlon-fadd")
560(define_insn_reservation "athlon_fcom" 2
561                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
562                                    (eq_attr "type" "fcmp"))
563                               "athlon-direct,athlon-fpsched,athlon-fadd")
564;; Never seen by the scheduler because we still don't do post reg-stack
565;; scheduling.
566;(define_insn_reservation "athlon_fxch" 2
567;                              (and (eq_attr "cpu" "athlon,k8,amdfam10")
568;                                   (eq_attr "type" "fxch"))
569;                              "athlon-direct,athlon-fpsched,athlon-fany")
570
571;; Athlon handle MMX operations in the FPU unit with shorter latencies
572
573(define_insn_reservation "athlon_movlpd_load" 0
574                               (and (eq_attr "cpu" "athlon")
575                                    (and (eq_attr "type" "ssemov")
576                                           (match_operand:DF 1 "memory_operand")))
577                               "athlon-direct,athlon-fpload,athlon-fany")
578(define_insn_reservation "athlon_movlpd_load_k8" 2
579                               (and (eq_attr "cpu" "k8")
580                                    (and (eq_attr "type" "ssemov")
581                                           (match_operand:DF 1 "memory_operand")))
582                               "athlon-direct,athlon-fploadk8,athlon-fstore")
583(define_insn_reservation "athlon_movaps_load_k8" 2
584                               (and (eq_attr "cpu" "k8")
585                                    (and (eq_attr "type" "ssemov")
586                                           (and (eq_attr "mode" "V4SF,V2DF,TI")
587                                                  (eq_attr "memory" "load"))))
588                               "athlon-double,athlon-fpload2k8,athlon-fstore,athlon-fstore")
589(define_insn_reservation "athlon_movaps_load" 0
590                               (and (eq_attr "cpu" "athlon")
591                                    (and (eq_attr "type" "ssemov")
592                                           (and (eq_attr "mode" "V4SF,V2DF,TI")
593                                                  (eq_attr "memory" "load"))))
594                               "athlon-vector,athlon-fpload2,(athlon-fany+athlon-fany)")
595(define_insn_reservation "athlon_movss_load" 1
596                               (and (eq_attr "cpu" "athlon")
597                                    (and (eq_attr "type" "ssemov")
598                                           (and (eq_attr "mode" "SF,DI")
599                                                  (eq_attr "memory" "load"))))
600                               "athlon-vector,athlon-fpload,(athlon-fany*2)")
601(define_insn_reservation "athlon_movss_load_k8" 1
602                               (and (eq_attr "cpu" "k8")
603                                    (and (eq_attr "type" "ssemov")
604                                           (and (eq_attr "mode" "SF,DI")
605                                                  (eq_attr "memory" "load"))))
606                               "athlon-double,athlon-fploadk8,(athlon-fstore+athlon-fany)")
607(define_insn_reservation "athlon_mmxsseld" 0
608                               (and (eq_attr "cpu" "athlon")
609                                    (and (eq_attr "type" "mmxmov,ssemov")
610                                           (eq_attr "memory" "load")))
611                               "athlon-direct,athlon-fpload,athlon-fany")
612(define_insn_reservation "athlon_mmxsseld_k8" 2
613                               (and (eq_attr "cpu" "k8")
614                                    (and (eq_attr "type" "mmxmov,ssemov")
615                                           (eq_attr "memory" "load")))
616                               "athlon-direct,athlon-fploadk8,athlon-fstore")
617;; On AMDFAM10 all double, single and integer packed and scalar SSEx data
618;; loads  generated are direct path, latency of 2 and do not use any FP
619;; executions units. No separate entries for movlpx/movhpx loads, which
620;; are direct path, latency of 4 and use the FADD/FMUL FP execution units,
621;; as they will not be generated.
622(define_insn_reservation "athlon_sseld_amdfam10" 2
623                               (and (eq_attr "cpu" "amdfam10")
624                                    (and (eq_attr "type" "ssemov")
625                                           (eq_attr "memory" "load")))
626                               "athlon-direct,athlon-fploadk8")
627;; On AMDFAM10 MMX data loads  generated are direct path, latency of 4
628;; and can use any  FP executions units
629(define_insn_reservation "athlon_mmxld_amdfam10" 4
630                               (and (eq_attr "cpu" "amdfam10")
631                                    (and (eq_attr "type" "mmxmov")
632                                           (eq_attr "memory" "load")))
633                               "athlon-direct,athlon-fploadk8, athlon-fany")
634(define_insn_reservation "athlon_mmxssest" 3
635                               (and (eq_attr "cpu" "k8")
636                                    (and (eq_attr "type" "mmxmov,ssemov")
637                                           (and (eq_attr "mode" "V4SF,V2DF,TI")
638                                                  (eq_attr "memory" "store,both"))))
639                               "athlon-vector,(athlon-fpsched+athlon-agu),((athlon-fstore+athlon-store2)*2)")
640(define_insn_reservation "athlon_mmxssest_k8" 3
641                               (and (eq_attr "cpu" "k8")
642                                    (and (eq_attr "type" "mmxmov,ssemov")
643                                           (and (eq_attr "mode" "V4SF,V2DF,TI")
644                                                  (eq_attr "memory" "store,both"))))
645                               "athlon-double,(athlon-fpsched+athlon-agu),((athlon-fstore+athlon-store2)*2)")
646(define_insn_reservation "athlon_mmxssest_short" 2
647                               (and (eq_attr "cpu" "athlon,k8")
648                                    (and (eq_attr "type" "mmxmov,ssemov")
649                                           (eq_attr "memory" "store,both")))
650                               "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
651;; On AMDFAM10 all double, single and integer packed SSEx data stores
652;; generated are all double path, latency of 2 and use the FSTORE FP
653;; execution unit. No entries separate for movupx/movdqu, which are
654;; vector path, latency of 3 and use the FSTORE*2 FP execution unit,
655;; as they will not be generated.
656(define_insn_reservation "athlon_ssest_amdfam10" 2
657                               (and (eq_attr "cpu" "amdfam10")
658                                    (and (eq_attr "type" "ssemov")
659                                           (and (eq_attr "mode" "V4SF,V2DF,TI")
660                                                  (eq_attr "memory" "store,both"))))
661                               "athlon-double,(athlon-fpsched+athlon-agu),((athlon-fstore+athlon-store)*2)")
662;; On AMDFAM10 all double, single and integer scalar SSEx and MMX
663;; data stores generated are all direct path, latency of 2 and use
664;; the FSTORE FP execution unit
665(define_insn_reservation "athlon_mmxssest_short_amdfam10" 2
666                               (and (eq_attr "cpu" "amdfam10")
667                                    (and (eq_attr "type" "mmxmov,ssemov")
668                                           (eq_attr "memory" "store,both")))
669                               "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
670(define_insn_reservation "athlon_movaps_k8" 2
671                               (and (eq_attr "cpu" "k8")
672                                    (and (eq_attr "type" "ssemov")
673                                           (eq_attr "mode" "V4SF,V2DF,TI")))
674                               "athlon-double,athlon-fpsched,((athlon-faddmul+athlon-faddmul) | (athlon-faddmul, athlon-faddmul))")
675(define_insn_reservation "athlon_movaps" 2
676                               (and (eq_attr "cpu" "athlon")
677                                    (and (eq_attr "type" "ssemov")
678                                           (eq_attr "mode" "V4SF,V2DF,TI")))
679                               "athlon-vector,athlon-fpsched,(athlon-faddmul+athlon-faddmul)")
680(define_insn_reservation "athlon_mmxssemov" 2
681                               (and (eq_attr "cpu" "athlon,k8")
682                                    (eq_attr "type" "mmxmov,ssemov"))
683                               "athlon-direct,athlon-fpsched,athlon-faddmul")
684(define_insn_reservation "athlon_mmxmul_load" 4
685                               (and (eq_attr "cpu" "athlon,k8")
686                                    (and (eq_attr "type" "mmxmul")
687                                           (eq_attr "memory" "load")))
688                               "athlon-direct,athlon-fpload,athlon-fmul")
689(define_insn_reservation "athlon_mmxmul" 3
690                               (and (eq_attr "cpu" "athlon,k8")
691                                    (eq_attr "type" "mmxmul"))
692                               "athlon-direct,athlon-fpsched,athlon-fmul")
693(define_insn_reservation "athlon_mmx_load" 3
694                               (and (eq_attr "cpu" "athlon,k8")
695                                    (and (eq_attr "unit" "mmx")
696                                           (eq_attr "memory" "load")))
697                               "athlon-direct,athlon-fpload,athlon-faddmul")
698(define_insn_reservation "athlon_mmx" 2
699                               (and (eq_attr "cpu" "athlon,k8")
700                                    (eq_attr "unit" "mmx"))
701                               "athlon-direct,athlon-fpsched,athlon-faddmul")
702;; SSE operations are handled by the i387 unit as well.  The latency
703;; is same as for i387 operations for scalar operations
704
705(define_insn_reservation "athlon_sselog_load" 3
706                               (and (eq_attr "cpu" "athlon")
707                                    (and (eq_attr "type" "sselog,sselog1,sseshuf,sseshuf1")
708                                           (eq_attr "memory" "load")))
709                               "athlon-vector,athlon-fpload2,(athlon-fmul*2)")
710(define_insn_reservation "athlon_sselog_load_k8" 5
711                               (and (eq_attr "cpu" "k8")
712                                    (and (eq_attr "type" "sselog,sselog1,sseshuf,sseshuf1")
713                                           (eq_attr "memory" "load")))
714                               "athlon-double,athlon-fpload2k8,(athlon-fmul*2)")
715(define_insn_reservation "athlon_sselog_load_amdfam10" 4
716                               (and (eq_attr "cpu" "amdfam10")
717                                    (and (eq_attr "type" "sselog,sselog1,sseshuf,sseshuf1")
718                                           (eq_attr "memory" "load")))
719                               "athlon-direct,athlon-fploadk8,(athlon-fadd|athlon-fmul)")
720(define_insn_reservation "athlon_sselog" 3
721                               (and (eq_attr "cpu" "athlon")
722                                    (eq_attr "type" "sselog,sselog1,sseshuf,sseshuf1"))
723                               "athlon-vector,athlon-fpsched,athlon-fmul*2")
724(define_insn_reservation "athlon_sselog_k8" 3
725                               (and (eq_attr "cpu" "k8")
726                                    (eq_attr "type" "sselog,sselog1,sseshuf,sseshuf1"))
727                               "athlon-double,athlon-fpsched,athlon-fmul")
728(define_insn_reservation "athlon_sselog_amdfam10" 2
729                               (and (eq_attr "cpu" "amdfam10")
730                                    (eq_attr "type" "sselog,sselog1,sseshuf,sseshuf1"))
731                               "athlon-direct,athlon-fpsched,(athlon-fadd|athlon-fmul)")
732
733;; ??? pcmp executes in addmul, probably not worthwhile to bother about that.
734(define_insn_reservation "athlon_ssecmp_load" 2
735                               (and (eq_attr "cpu" "athlon")
736                                    (and (eq_attr "type" "ssecmp")
737                                           (and (eq_attr "mode" "SF,DF,DI")
738                                                  (eq_attr "memory" "load"))))
739                               "athlon-direct,athlon-fpload,athlon-fadd")
740(define_insn_reservation "athlon_ssecmp_load_k8" 4
741                               (and (eq_attr "cpu" "k8,amdfam10")
742                                    (and (eq_attr "type" "ssecmp")
743                                           (and (eq_attr "mode" "SF,DF,DI,TI")
744                                                  (eq_attr "memory" "load"))))
745                               "athlon-direct,athlon-fploadk8,athlon-fadd")
746(define_insn_reservation "athlon_ssecmp" 2
747                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
748                                    (and (eq_attr "type" "ssecmp")
749                                           (eq_attr "mode" "SF,DF,DI,TI")))
750                               "athlon-direct,athlon-fpsched,athlon-fadd")
751(define_insn_reservation "athlon_ssecmpvector_load" 3
752                               (and (eq_attr "cpu" "athlon")
753                                    (and (eq_attr "type" "ssecmp")
754                                           (eq_attr "memory" "load")))
755                               "athlon-vector,athlon-fpload2,(athlon-fadd*2)")
756(define_insn_reservation "athlon_ssecmpvector_load_k8" 5
757                               (and (eq_attr "cpu" "k8")
758                                    (and (eq_attr "type" "ssecmp")
759                                           (eq_attr "memory" "load")))
760                               "athlon-double,athlon-fpload2k8,(athlon-fadd*2)")
761(define_insn_reservation "athlon_ssecmpvector_load_amdfam10" 4
762                               (and (eq_attr "cpu" "amdfam10")
763                                    (and (eq_attr "type" "ssecmp")
764                                           (eq_attr "memory" "load")))
765                               "athlon-direct,athlon-fploadk8,athlon-fadd")
766(define_insn_reservation "athlon_ssecmpvector" 3
767                               (and (eq_attr "cpu" "athlon")
768                                    (eq_attr "type" "ssecmp"))
769                               "athlon-vector,athlon-fpsched,(athlon-fadd*2)")
770(define_insn_reservation "athlon_ssecmpvector_k8" 3
771                               (and (eq_attr "cpu" "k8")
772                                    (eq_attr "type" "ssecmp"))
773                               "athlon-double,athlon-fpsched,(athlon-fadd*2)")
774(define_insn_reservation "athlon_ssecmpvector_amdfam10" 2
775                               (and (eq_attr "cpu" "amdfam10")
776                                    (eq_attr "type" "ssecmp"))
777                               "athlon-direct,athlon-fpsched,athlon-fadd")
778(define_insn_reservation "athlon_ssecomi_load" 4
779                               (and (eq_attr "cpu" "athlon")
780                                    (and (eq_attr "type" "ssecomi")
781                                           (eq_attr "memory" "load")))
782                               "athlon-vector,athlon-fpload,athlon-fadd")
783(define_insn_reservation "athlon_ssecomi_load_k8" 6
784                               (and (eq_attr "cpu" "k8")
785                                    (and (eq_attr "type" "ssecomi")
786                                           (eq_attr "memory" "load")))
787                               "athlon-vector,athlon-fploadk8,athlon-fadd")
788(define_insn_reservation "athlon_ssecomi_load_amdfam10" 5
789                               (and (eq_attr "cpu" "amdfam10")
790                                    (and (eq_attr "type" "ssecomi")
791                                           (eq_attr "memory" "load")))
792                               "athlon-direct,athlon-fploadk8,athlon-fadd")
793(define_insn_reservation "athlon_ssecomi" 4
794                               (and (eq_attr "cpu" "athlon,k8")
795                                    (eq_attr "type" "ssecomi"))
796                               "athlon-vector,athlon-fpsched,athlon-fadd")
797(define_insn_reservation "athlon_ssecomi_amdfam10" 3
798                               (and (eq_attr "cpu" "amdfam10")
799;; It seems athlon_ssecomi has a bug in the attr_type, fixed for amdfam10
800                                    (eq_attr "type" "ssecomi"))
801                               "athlon-direct,athlon-fpsched,athlon-fadd")
802(define_insn_reservation "athlon_sseadd_load" 4
803                               (and (eq_attr "cpu" "athlon")
804                                    (and (eq_attr "type" "sseadd,sseadd1")
805                                           (and (eq_attr "mode" "SF,DF,DI")
806                                                  (eq_attr "memory" "load"))))
807                               "athlon-direct,athlon-fpload,athlon-fadd")
808(define_insn_reservation "athlon_sseadd_load_k8" 6
809                               (and (eq_attr "cpu" "k8,amdfam10")
810                                    (and (eq_attr "type" "sseadd,sseadd1")
811                                           (and (eq_attr "mode" "SF,DF,DI")
812                                                  (eq_attr "memory" "load"))))
813                               "athlon-direct,athlon-fploadk8,athlon-fadd")
814(define_insn_reservation "athlon_sseadd" 4
815                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
816                                    (and (eq_attr "type" "sseadd,sseadd1")
817                                           (eq_attr "mode" "SF,DF,DI")))
818                               "athlon-direct,athlon-fpsched,athlon-fadd")
819(define_insn_reservation "athlon_sseaddvector_load" 5
820                               (and (eq_attr "cpu" "athlon")
821                                    (and (eq_attr "type" "sseadd,sseadd1")
822                                           (eq_attr "memory" "load")))
823                               "athlon-vector,athlon-fpload2,(athlon-fadd*2)")
824(define_insn_reservation "athlon_sseaddvector_load_k8" 7
825                               (and (eq_attr "cpu" "k8")
826                                    (and (eq_attr "type" "sseadd,sseadd1")
827                                           (eq_attr "memory" "load")))
828                               "athlon-double,athlon-fpload2k8,(athlon-fadd*2)")
829(define_insn_reservation "athlon_sseaddvector_load_amdfam10" 6
830                               (and (eq_attr "cpu" "amdfam10")
831                                    (and (eq_attr "type" "sseadd,sseadd1")
832                                           (eq_attr "memory" "load")))
833                               "athlon-direct,athlon-fploadk8,athlon-fadd")
834(define_insn_reservation "athlon_sseaddvector" 5
835                               (and (eq_attr "cpu" "athlon")
836                                    (eq_attr "type" "sseadd,sseadd1"))
837                               "athlon-vector,athlon-fpsched,(athlon-fadd*2)")
838(define_insn_reservation "athlon_sseaddvector_k8" 5
839                               (and (eq_attr "cpu" "k8")
840                                    (eq_attr "type" "sseadd,sseadd1"))
841                               "athlon-double,athlon-fpsched,(athlon-fadd*2)")
842(define_insn_reservation "athlon_sseaddvector_amdfam10" 4
843                               (and (eq_attr "cpu" "amdfam10")
844                                    (eq_attr "type" "sseadd,sseadd1"))
845                               "athlon-direct,athlon-fpsched,athlon-fadd")
846
847;; Conversions behaves very irregularly and the scheduling is critical here.
848;; Take each instruction separately.  Assume that the mode is always set to the
849;; destination one and athlon_decode is set to the K8 versions.
850
851;; cvtss2sd
852(define_insn_reservation "athlon_ssecvt_cvtss2sd_load_k8" 4
853                               (and (eq_attr "cpu" "k8,athlon")
854                                    (and (eq_attr "type" "ssecvt")
855                                           (and (eq_attr "athlon_decode" "direct")
856                                                  (and (eq_attr "mode" "DF")
857                                                       (eq_attr "memory" "load")))))
858                               "athlon-direct,athlon-fploadk8,athlon-fstore")
859(define_insn_reservation "athlon_ssecvt_cvtss2sd_load_amdfam10" 7
860                               (and (eq_attr "cpu" "amdfam10")
861                                    (and (eq_attr "type" "ssecvt")
862                                           (and (eq_attr "amdfam10_decode" "double")
863                                                  (and (eq_attr "mode" "DF")
864                                                       (eq_attr "memory" "load")))))
865                               "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
866(define_insn_reservation "athlon_ssecvt_cvtss2sd" 2
867                               (and (eq_attr "cpu" "athlon,k8")
868                                    (and (eq_attr "type" "ssecvt")
869                                           (and (eq_attr "athlon_decode" "direct")
870                                                  (eq_attr "mode" "DF"))))
871                               "athlon-direct,athlon-fpsched,athlon-fstore")
872(define_insn_reservation "athlon_ssecvt_cvtss2sd_amdfam10" 7
873                               (and (eq_attr "cpu" "amdfam10")
874                                    (and (eq_attr "type" "ssecvt")
875                                           (and (eq_attr "amdfam10_decode" "vector")
876                                                  (eq_attr "mode" "DF"))))
877                               "athlon-vector,athlon-fpsched,athlon-faddmul,(athlon-fstore*2)")
878;; cvtps2pd.  Model same way the other double decoded FP conversions.
879(define_insn_reservation "athlon_ssecvt_cvtps2pd_load_k8" 5
880                               (and (eq_attr "cpu" "k8,athlon")
881                                    (and (eq_attr "type" "ssecvt")
882                                           (and (eq_attr "athlon_decode" "double")
883                                                  (and (eq_attr "mode" "V2DF,V4SF,TI")
884                                                       (eq_attr "memory" "load")))))
885                               "athlon-double,athlon-fpload2k8,(athlon-fstore*2)")
886(define_insn_reservation "athlon_ssecvt_cvtps2pd_load_amdfam10" 4
887                               (and (eq_attr "cpu" "amdfam10")
888                                    (and (eq_attr "type" "ssecvt")
889                                           (and (eq_attr "amdfam10_decode" "direct")
890                                                  (and (eq_attr "mode" "V2DF,V4SF,TI")
891                                                       (eq_attr "memory" "load")))))
892                               "athlon-direct,athlon-fploadk8,athlon-fstore")
893(define_insn_reservation "athlon_ssecvt_cvtps2pd_k8" 3
894                               (and (eq_attr "cpu" "k8,athlon")
895                                    (and (eq_attr "type" "ssecvt")
896                                           (and (eq_attr "athlon_decode" "double")
897                                                  (eq_attr "mode" "V2DF,V4SF,TI"))))
898                               "athlon-double,athlon-fpsched,athlon-fstore,athlon-fstore")
899(define_insn_reservation "athlon_ssecvt_cvtps2pd_amdfam10" 2
900                               (and (eq_attr "cpu" "amdfam10")
901                                    (and (eq_attr "type" "ssecvt")
902                                           (and (eq_attr "amdfam10_decode" "direct")
903                                                  (eq_attr "mode" "V2DF,V4SF,TI"))))
904                               "athlon-direct,athlon-fpsched,athlon-fstore")
905;; cvtsi2sd mem,reg is directpath path  (cvtsi2sd reg,reg is doublepath)
906;; cvtsi2sd has troughput 1 and is executed in store unit with latency of 6
907(define_insn_reservation "athlon_sseicvt_cvtsi2sd_load" 6
908                               (and (eq_attr "cpu" "athlon,k8")
909                                    (and (eq_attr "type" "sseicvt")
910                                           (and (eq_attr "athlon_decode" "direct")
911                                                  (and (eq_attr "mode" "SF,DF")
912                                                       (eq_attr "memory" "load")))))
913                               "athlon-direct,athlon-fploadk8,athlon-fstore")
914(define_insn_reservation "athlon_sseicvt_cvtsi2sd_load_amdfam10" 9
915                               (and (eq_attr "cpu" "amdfam10")
916                                    (and (eq_attr "type" "sseicvt")
917                                           (and (eq_attr "amdfam10_decode" "double")
918                                                  (and (eq_attr "mode" "SF,DF")
919                                                       (eq_attr "memory" "load")))))
920                               "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
921;; cvtsi2ss mem, reg is doublepath
922(define_insn_reservation "athlon_sseicvt_cvtsi2ss_load" 9
923                               (and (eq_attr "cpu" "athlon")
924                                    (and (eq_attr "type" "sseicvt")
925                                           (and (eq_attr "athlon_decode" "double")
926                                                  (and (eq_attr "mode" "SF,DF")
927                                                       (eq_attr "memory" "load")))))
928                               "athlon-vector,athlon-fpload,(athlon-fstore*2)")
929(define_insn_reservation "athlon_sseicvt_cvtsi2ss_load_k8" 9
930                               (and (eq_attr "cpu" "k8")
931                                    (and (eq_attr "type" "sseicvt")
932                                           (and (eq_attr "athlon_decode" "double")
933                                                  (and (eq_attr "mode" "SF,DF")
934                                                       (eq_attr "memory" "load")))))
935                               "athlon-double,athlon-fploadk8,(athlon-fstore*2)")
936(define_insn_reservation "athlon_sseicvt_cvtsi2ss_load_amdfam10" 9
937                               (and (eq_attr "cpu" "amdfam10")
938                                    (and (eq_attr "type" "sseicvt")
939                                           (and (eq_attr "amdfam10_decode" "double")
940                                                  (and (eq_attr "mode" "SF,DF")
941                                                       (eq_attr "memory" "load")))))
942                               "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
943;; cvtsi2sd reg,reg is double decoded (vector on Athlon)
944(define_insn_reservation "athlon_sseicvt_cvtsi2sd_k8" 11
945                               (and (eq_attr "cpu" "k8,athlon")
946                                    (and (eq_attr "type" "sseicvt")
947                                           (and (eq_attr "athlon_decode" "double")
948                                                  (and (eq_attr "mode" "SF,DF")
949                                                       (eq_attr "memory" "none")))))
950                               "athlon-double,athlon-fploadk8,athlon-fstore")
951(define_insn_reservation "athlon_sseicvt_cvtsi2sd_amdfam10" 14
952                               (and (eq_attr "cpu" "amdfam10")
953                                    (and (eq_attr "type" "sseicvt")
954                                           (and (eq_attr "amdfam10_decode" "vector")
955                                                  (and (eq_attr "mode" "SF,DF")
956                                                       (eq_attr "memory" "none")))))
957                               "athlon-vector,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
958;; cvtsi2ss reg, reg is doublepath
959(define_insn_reservation "athlon_sseicvt_cvtsi2ss" 14
960                               (and (eq_attr "cpu" "athlon,k8")
961                                    (and (eq_attr "type" "sseicvt")
962                                           (and (eq_attr "athlon_decode" "vector")
963                                                  (and (eq_attr "mode" "SF,DF")
964                                                       (eq_attr "memory" "none")))))
965                               "athlon-vector,athlon-fploadk8,(athlon-fvector*2)")
966(define_insn_reservation "athlon_sseicvt_cvtsi2ss_amdfam10" 14
967                               (and (eq_attr "cpu" "amdfam10")
968                                    (and (eq_attr "type" "sseicvt")
969                                           (and (eq_attr "amdfam10_decode" "vector")
970                                                  (and (eq_attr "mode" "SF,DF")
971                                                       (eq_attr "memory" "none")))))
972                               "athlon-vector,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
973;; cvtsd2ss mem,reg is doublepath, troughput unknown, latency 9
974(define_insn_reservation "athlon_ssecvt_cvtsd2ss_load_k8" 9
975                               (and (eq_attr "cpu" "k8,athlon")
976                                    (and (eq_attr "type" "ssecvt")
977                                           (and (eq_attr "athlon_decode" "double")
978                                                  (and (eq_attr "mode" "SF")
979                                                       (eq_attr "memory" "load")))))
980                               "athlon-double,athlon-fploadk8,(athlon-fstore*3)")
981(define_insn_reservation "athlon_ssecvt_cvtsd2ss_load_amdfam10" 9
982                               (and (eq_attr "cpu" "amdfam10")
983                                    (and (eq_attr "type" "ssecvt")
984                                           (and (eq_attr "amdfam10_decode" "double")
985                                                  (and (eq_attr "mode" "SF")
986                                                       (eq_attr "memory" "load")))))
987                               "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
988;; cvtsd2ss reg,reg is vectorpath, troughput unknown, latency 12
989(define_insn_reservation "athlon_ssecvt_cvtsd2ss" 12
990                               (and (eq_attr "cpu" "athlon,k8")
991                                    (and (eq_attr "type" "ssecvt")
992                                           (and (eq_attr "athlon_decode" "vector")
993                                                  (and (eq_attr "mode" "SF")
994                                                       (eq_attr "memory" "none")))))
995                               "athlon-vector,athlon-fpsched,(athlon-fvector*3)")
996(define_insn_reservation "athlon_ssecvt_cvtsd2ss_amdfam10" 8
997                               (and (eq_attr "cpu" "amdfam10")
998                                    (and (eq_attr "type" "ssecvt")
999                                           (and (eq_attr "amdfam10_decode" "vector")
1000                                                  (and (eq_attr "mode" "SF")
1001                                                       (eq_attr "memory" "none")))))
1002                               "athlon-vector,athlon-fpsched,athlon-faddmul,(athlon-fstore*2)")
1003(define_insn_reservation "athlon_ssecvt_cvtpd2ps_load_k8" 8
1004                               (and (eq_attr "cpu" "athlon,k8")
1005                                    (and (eq_attr "type" "ssecvt")
1006                                           (and (eq_attr "athlon_decode" "vector")
1007                                                  (and (eq_attr "mode" "V4SF,V2DF,TI")
1008                                                       (eq_attr "memory" "load")))))
1009                               "athlon-double,athlon-fpload2k8,(athlon-fstore*3)")
1010(define_insn_reservation "athlon_ssecvt_cvtpd2ps_load_amdfam10" 9
1011                               (and (eq_attr "cpu" "amdfam10")
1012                                    (and (eq_attr "type" "ssecvt")
1013                                           (and (eq_attr "amdfam10_decode" "double")
1014                                                  (and (eq_attr "mode" "V4SF,V2DF,TI")
1015                                                       (eq_attr "memory" "load")))))
1016                               "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
1017;; cvtpd2ps mem,reg is vectorpath, troughput unknown, latency 10
1018;; ??? Why it is fater than cvtsd2ss?
1019(define_insn_reservation "athlon_ssecvt_cvtpd2ps" 8
1020                               (and (eq_attr "cpu" "athlon,k8")
1021                                    (and (eq_attr "type" "ssecvt")
1022                                           (and (eq_attr "athlon_decode" "vector")
1023                                                  (and (eq_attr "mode" "V4SF,V2DF,TI")
1024                                                       (eq_attr "memory" "none")))))
1025                               "athlon-vector,athlon-fpsched,athlon-fvector*2")
1026(define_insn_reservation "athlon_ssecvt_cvtpd2ps_amdfam10" 7
1027                               (and (eq_attr "cpu" "amdfam10")
1028                                    (and (eq_attr "type" "ssecvt")
1029                                           (and (eq_attr "amdfam10_decode" "double")
1030                                                  (and (eq_attr "mode" "V4SF,V2DF,TI")
1031                                                       (eq_attr "memory" "none")))))
1032                               "athlon-double,athlon-fpsched,(athlon-faddmul+athlon-fstore)")
1033;; cvtsd2si mem,reg is doublepath, troughput 1, latency 9
1034(define_insn_reservation "athlon_secvt_cvtsX2si_load" 9
1035                               (and (eq_attr "cpu" "athlon,k8")
1036                                    (and (eq_attr "type" "sseicvt")
1037                                           (and (eq_attr "athlon_decode" "vector")
1038                                                  (and (eq_attr "mode" "SI,DI")
1039                                                       (eq_attr "memory" "load")))))
1040                               "athlon-vector,athlon-fploadk8,athlon-fvector")
1041(define_insn_reservation "athlon_secvt_cvtsX2si_load_amdfam10" 10
1042                               (and (eq_attr "cpu" "amdfam10")
1043                                    (and (eq_attr "type" "sseicvt")
1044                                           (and (eq_attr "amdfam10_decode" "double")
1045                                                  (and (eq_attr "mode" "SI,DI")
1046                                                       (eq_attr "memory" "load")))))
1047                               "athlon-double,athlon-fploadk8,(athlon-fadd+athlon-fstore)")
1048;; cvtsd2si reg,reg is doublepath, troughput 1, latency 9
1049(define_insn_reservation "athlon_ssecvt_cvtsX2si" 9
1050                               (and (eq_attr "cpu" "athlon")
1051                                    (and (eq_attr "type" "sseicvt")
1052                                           (and (eq_attr "athlon_decode" "double")
1053                                                  (and (eq_attr "mode" "SI,DI")
1054                                                       (eq_attr "memory" "none")))))
1055                               "athlon-vector,athlon-fpsched,athlon-fvector")
1056(define_insn_reservation "athlon_ssecvt_cvtsX2si_k8" 9
1057                               (and (eq_attr "cpu" "k8")
1058                                    (and (eq_attr "type" "sseicvt")
1059                                           (and (eq_attr "athlon_decode" "double")
1060                                                  (and (eq_attr "mode" "SI,DI")
1061                                                       (eq_attr "memory" "none")))))
1062                               "athlon-double,athlon-fpsched,athlon-fstore")
1063(define_insn_reservation "athlon_ssecvt_cvtsX2si_amdfam10" 8
1064                               (and (eq_attr "cpu" "amdfam10")
1065                                    (and (eq_attr "type" "sseicvt")
1066                                           (and (eq_attr "amdfam10_decode" "double")
1067                                                  (and (eq_attr "mode" "SI,DI")
1068                                                       (eq_attr "memory" "none")))))
1069                               "athlon-double,athlon-fpsched,(athlon-fadd+athlon-fstore)")
1070;; cvtpd2dq reg,mem is doublepath, troughput 1, latency 9 on amdfam10
1071(define_insn_reservation "athlon_sseicvt_cvtpd2dq_load_amdfam10" 9
1072                               (and (eq_attr "cpu" "amdfam10")
1073                                    (and (eq_attr "type" "sseicvt")
1074                                           (and (eq_attr "amdfam10_decode" "double")
1075                                                  (and (eq_attr "mode" "TI")
1076                                                       (eq_attr "memory" "load")))))
1077                               "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
1078;; cvtpd2dq reg,mem is doublepath, troughput 1, latency 7 on amdfam10
1079(define_insn_reservation "athlon_sseicvt_cvtpd2dq_amdfam10" 7
1080                               (and (eq_attr "cpu" "amdfam10")
1081                                    (and (eq_attr "type" "sseicvt")
1082                                           (and (eq_attr "amdfam10_decode" "double")
1083                                                  (and (eq_attr "mode" "TI")
1084                                                       (eq_attr "memory" "none")))))
1085                               "athlon-double,athlon-fpsched,(athlon-faddmul+athlon-fstore)")
1086
1087
1088(define_insn_reservation "athlon_ssemul_load" 4
1089                               (and (eq_attr "cpu" "athlon")
1090                                    (and (eq_attr "type" "ssemul")
1091                                           (and (eq_attr "mode" "SF,DF")
1092                                                  (eq_attr "memory" "load"))))
1093                               "athlon-direct,athlon-fpload,athlon-fmul")
1094(define_insn_reservation "athlon_ssemul_load_k8" 6
1095                               (and (eq_attr "cpu" "k8,amdfam10")
1096                                    (and (eq_attr "type" "ssemul")
1097                                           (and (eq_attr "mode" "SF,DF")
1098                                                  (eq_attr "memory" "load"))))
1099                               "athlon-direct,athlon-fploadk8,athlon-fmul")
1100(define_insn_reservation "athlon_ssemul" 4
1101                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
1102                                    (and (eq_attr "type" "ssemul")
1103                                           (eq_attr "mode" "SF,DF")))
1104                               "athlon-direct,athlon-fpsched,athlon-fmul")
1105(define_insn_reservation "athlon_ssemulvector_load" 5
1106                               (and (eq_attr "cpu" "athlon")
1107                                    (and (eq_attr "type" "ssemul")
1108                                           (eq_attr "memory" "load")))
1109                               "athlon-vector,athlon-fpload2,(athlon-fmul*2)")
1110(define_insn_reservation "athlon_ssemulvector_load_k8" 7
1111                               (and (eq_attr "cpu" "k8")
1112                                    (and (eq_attr "type" "ssemul")
1113                                           (eq_attr "memory" "load")))
1114                               "athlon-double,athlon-fpload2k8,(athlon-fmul*2)")
1115(define_insn_reservation "athlon_ssemulvector_load_amdfam10" 6
1116                               (and (eq_attr "cpu" "amdfam10")
1117                                    (and (eq_attr "type" "ssemul")
1118                                           (eq_attr "memory" "load")))
1119                               "athlon-direct,athlon-fploadk8,athlon-fmul")
1120(define_insn_reservation "athlon_ssemulvector" 5
1121                               (and (eq_attr "cpu" "athlon")
1122                                    (eq_attr "type" "ssemul"))
1123                               "athlon-vector,athlon-fpsched,(athlon-fmul*2)")
1124(define_insn_reservation "athlon_ssemulvector_k8" 5
1125                               (and (eq_attr "cpu" "k8")
1126                                    (eq_attr "type" "ssemul"))
1127                               "athlon-double,athlon-fpsched,(athlon-fmul*2)")
1128(define_insn_reservation "athlon_ssemulvector_amdfam10" 4
1129                               (and (eq_attr "cpu" "amdfam10")
1130                                    (eq_attr "type" "ssemul"))
1131                               "athlon-direct,athlon-fpsched,athlon-fmul")
1132;; divsd timings.  divss is faster
1133(define_insn_reservation "athlon_ssediv_load" 20
1134                               (and (eq_attr "cpu" "athlon")
1135                                    (and (eq_attr "type" "ssediv")
1136                                           (and (eq_attr "mode" "SF,DF")
1137                                                  (eq_attr "memory" "load"))))
1138                               "athlon-direct,athlon-fpload,athlon-fmul*17")
1139(define_insn_reservation "athlon_ssediv_load_k8" 22
1140                               (and (eq_attr "cpu" "k8,amdfam10")
1141                                    (and (eq_attr "type" "ssediv")
1142                                           (and (eq_attr "mode" "SF,DF")
1143                                                  (eq_attr "memory" "load"))))
1144                               "athlon-direct,athlon-fploadk8,athlon-fmul*17")
1145(define_insn_reservation "athlon_ssediv" 20
1146                               (and (eq_attr "cpu" "athlon,k8,amdfam10")
1147                                    (and (eq_attr "type" "ssediv")
1148                                           (eq_attr "mode" "SF,DF")))
1149                               "athlon-direct,athlon-fpsched,athlon-fmul*17")
1150(define_insn_reservation "athlon_ssedivvector_load" 39
1151                               (and (eq_attr "cpu" "athlon")
1152                                    (and (eq_attr "type" "ssediv")
1153                                           (eq_attr "memory" "load")))
1154                               "athlon-vector,athlon-fpload2,athlon-fmul*34")
1155(define_insn_reservation "athlon_ssedivvector_load_k8" 35
1156                               (and (eq_attr "cpu" "k8")
1157                                    (and (eq_attr "type" "ssediv")
1158                                           (eq_attr "memory" "load")))
1159                               "athlon-double,athlon-fpload2k8,athlon-fmul*34")
1160(define_insn_reservation "athlon_ssedivvector_load_amdfam10" 22
1161                               (and (eq_attr "cpu" "amdfam10")
1162                                    (and (eq_attr "type" "ssediv")
1163                                           (eq_attr "memory" "load")))
1164                               "athlon-direct,athlon-fploadk8,athlon-fmul*17")
1165(define_insn_reservation "athlon_ssedivvector" 39
1166                               (and (eq_attr "cpu" "athlon")
1167                                    (eq_attr "type" "ssediv"))
1168                               "athlon-vector,athlon-fmul*34")
1169(define_insn_reservation "athlon_ssedivvector_k8" 39
1170                               (and (eq_attr "cpu" "k8")
1171                                    (eq_attr "type" "ssediv"))
1172                               "athlon-double,athlon-fmul*34")
1173(define_insn_reservation "athlon_ssedivvector_amdfam10" 20
1174                               (and (eq_attr "cpu" "amdfam10")
1175                                    (eq_attr "type" "ssediv"))
1176                               "athlon-direct,athlon-fmul*17")
1177(define_insn_reservation "athlon_sseins_amdfam10" 5
1178                         (and (eq_attr "cpu" "amdfam10")
1179                              (and (eq_attr "type" "sseins")
1180                                   (eq_attr "mode" "TI")))
1181                         "athlon-vector,athlon-fpsched,athlon-faddmul")
1182