1117395Skan;; AMD Athlon Scheduling
2117395Skan;;
3117395Skan;; The Athlon does contain three pipelined FP units, three integer units and
4117395Skan;; three address generation units. 
5117395Skan;;
6117395Skan;; The predecode logic is determining boundaries of instructions in the 64
7117395Skan;; byte cache line. So the cache line straddling problem of K6 might be issue
8117395Skan;; here as well, but it is not noted in the documentation.
9117395Skan;;
10117395Skan;; Three DirectPath instructions decoders and only one VectorPath decoder
11117395Skan;; is available. They can decode three DirectPath instructions or one VectorPath
12117395Skan;; instruction per cycle.
13117395Skan;; Decoded macro instructions are then passed to 72 entry instruction control
14117395Skan;; unit, that passes
15117395Skan;; it to the specialized integer (18 entry) and fp (36 entry) schedulers.
16117395Skan;;
17117395Skan;; The load/store queue unit is not attached to the schedulers but
18117395Skan;; communicates with all the execution units separately instead.
19117395Skan
20132718Skan(define_attr "athlon_decode" "direct,vector,double"
21132718Skan  (cond [(eq_attr "type" "call,imul,idiv,other,multi,fcmov,fpspc,str,pop,cld,leave")
22132718Skan	   (const_string "vector")
23132718Skan         (and (eq_attr "type" "push")
24132718Skan              (match_operand 1 "memory_operand" ""))
25132718Skan	   (const_string "vector")
26132718Skan         (and (eq_attr "type" "fmov")
27132718Skan	      (and (eq_attr "memory" "load,store")
28132718Skan		   (eq_attr "mode" "XF")))
29132718Skan	   (const_string "vector")]
30132718Skan	(const_string "direct")))
31117395Skan
32251212Spfg(define_attr "amdfam10_decode" "direct,vector,double"
33251212Spfg  (const_string "direct"))
34132718Skan;;
35132718Skan;;           decode0 decode1 decode2
36132718Skan;;                 \    |   /
37132718Skan;;    instruction control unit (72 entry scheduler)
38132718Skan;;                |                        |
39132718Skan;;      integer scheduler (18)         stack map
40132718Skan;;     /  |    |    |    |   \        stack rename
41132718Skan;;  ieu0 agu0 ieu1 agu1 ieu2 agu2      scheduler
42132718Skan;;    |  agu0  |   agu1      agu2    register file
43132718Skan;;    |      \ |    |       /         |     |     |
44132718Skan;;     \      /\    |     /         fadd  fmul  fstore
45132718Skan;;       \  /    \  |   /           fadd  fmul  fstore
46132718Skan;;       imul  load/store (2x)      fadd  fmul  fstore
47117395Skan
48132718Skan(define_automaton "athlon,athlon_load,athlon_mult,athlon_fp")
49132718Skan(define_cpu_unit "athlon-decode0" "athlon")
50132718Skan(define_cpu_unit "athlon-decode1" "athlon")
51132718Skan(define_cpu_unit "athlon-decode2" "athlon")
52132718Skan(define_cpu_unit "athlon-decodev" "athlon")
53132718Skan;; Model the fact that double decoded instruction may take 2 cycles
54132718Skan;; to decode when decoder2 and decoder0 in next cycle
55132718Skan;; is used (this is needed to allow troughput of 1.5 double decoded
56132718Skan;; instructions per cycle).
57132718Skan;;
58132718Skan;; In order to avoid dependence between reservation of decoder
59132718Skan;; and other units, we model decoder as two stage fully pipelined unit
60132718Skan;; and only double decoded instruction may occupy unit in the first cycle.
61132718Skan;; With this scheme however two double instructions can be issued cycle0.
62132718Skan;;
63132718Skan;; Avoid this by using presence set requiring decoder0 to be allocated
64132718Skan;; too. Vector decoded instructions then can't be issued when
65132718Skan;; modeled as consuming decoder0+decoder1+decoder2.
66132718Skan;; We solve that by specialized vector decoder unit and exclusion set.
67132718Skan(presence_set "athlon-decode2" "athlon-decode0")
68132718Skan(exclusion_set "athlon-decodev" "athlon-decode0,athlon-decode1,athlon-decode2")
69132718Skan(define_reservation "athlon-vector" "nothing,athlon-decodev")
70132718Skan(define_reservation "athlon-direct0" "nothing,athlon-decode0")
71132718Skan(define_reservation "athlon-direct" "nothing,
72132718Skan				     (athlon-decode0 | athlon-decode1
73132718Skan				     | athlon-decode2)")
74132718Skan;; Double instructions behaves like two direct instructions.
75132718Skan(define_reservation "athlon-double" "((athlon-decode2, athlon-decode0)
76132718Skan				     | (nothing,(athlon-decode0 + athlon-decode1))
77132718Skan				     | (nothing,(athlon-decode1 + athlon-decode2)))")
78117395Skan
79132718Skan;; Agu and ieu unit results in extremely large automatons and
80132718Skan;; in our approximation they are hardly filled in.  Only ieu
81132718Skan;; unit can, as issue rate is 3 and agu unit is always used
82132718Skan;; first in the insn reservations.  Skip the models.
83117395Skan
84132718Skan;(define_cpu_unit "athlon-ieu0" "athlon_ieu")
85132718Skan;(define_cpu_unit "athlon-ieu1" "athlon_ieu")
86132718Skan;(define_cpu_unit "athlon-ieu2" "athlon_ieu")
87132718Skan;(define_reservation "athlon-ieu" "(athlon-ieu0 | athlon-ieu1 | athlon-ieu2)")
88132718Skan(define_reservation "athlon-ieu" "nothing")
89132718Skan(define_cpu_unit "athlon-ieu0" "athlon")
90132718Skan;(define_cpu_unit "athlon-agu0" "athlon_agu")
91132718Skan;(define_cpu_unit "athlon-agu1" "athlon_agu")
92132718Skan;(define_cpu_unit "athlon-agu2" "athlon_agu")
93132718Skan;(define_reservation "athlon-agu" "(athlon-agu0 | athlon-agu1 | athlon-agu2)")
94132718Skan(define_reservation "athlon-agu" "nothing")
95117395Skan
96132718Skan(define_cpu_unit "athlon-mult" "athlon_mult")
97117395Skan
98132718Skan(define_cpu_unit "athlon-load0" "athlon_load")
99132718Skan(define_cpu_unit "athlon-load1" "athlon_load")
100132718Skan(define_reservation "athlon-load" "athlon-agu,
101132718Skan				   (athlon-load0 | athlon-load1),nothing")
102132718Skan;; 128bit SSE instructions issue two loads at once
103132718Skan(define_reservation "athlon-load2" "athlon-agu,
104132718Skan				   (athlon-load0 + athlon-load1),nothing")
105117395Skan
106132718Skan(define_reservation "athlon-store" "(athlon-load0 | athlon-load1)")
107132718Skan;; 128bit SSE instructions issue two stores at once
108132718Skan(define_reservation "athlon-store2" "(athlon-load0 + athlon-load1)")
109117395Skan
110117395Skan
111132718Skan;; The FP operations start to execute at stage 12 in the pipeline, while
112132718Skan;; integer operations start to execute at stage 9 for Athlon and 11 for K8
113132718Skan;; Compensate the difference for Athlon because it results in significantly
114132718Skan;; smaller automata.
115132718Skan(define_reservation "athlon-fpsched" "nothing,nothing,nothing")
116132718Skan;; The floating point loads.
117132718Skan(define_reservation "athlon-fpload" "(athlon-fpsched + athlon-load)")
118132718Skan(define_reservation "athlon-fpload2" "(athlon-fpsched + athlon-load2)")
119132718Skan(define_reservation "athlon-fploadk8" "(athlon-fpsched + athlon-load)")
120132718Skan(define_reservation "athlon-fpload2k8" "(athlon-fpsched + athlon-load2)")
121117395Skan
122117395Skan
123132718Skan;; The three fp units are fully pipelined with latency of 3
124132718Skan(define_cpu_unit "athlon-fadd" "athlon_fp")
125132718Skan(define_cpu_unit "athlon-fmul" "athlon_fp")
126132718Skan(define_cpu_unit "athlon-fstore" "athlon_fp")
127132718Skan(define_reservation "athlon-fany" "(athlon-fstore | athlon-fmul | athlon-fadd)")
128169689Skan(define_reservation "athlon-faddmul" "(athlon-fadd | athlon-fmul)")
129117395Skan
130132718Skan;; Vector operations usually consume many of pipes.
131132718Skan(define_reservation "athlon-fvector" "(athlon-fadd + athlon-fmul + athlon-fstore)")
132117395Skan
133117395Skan
134132718Skan;; Jump instructions are executed in the branch unit completely transparent to us
135132718Skan(define_insn_reservation "athlon_branch" 0
136251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
137132718Skan			      (eq_attr "type" "ibr"))
138132718Skan			 "athlon-direct,athlon-ieu")
139132718Skan(define_insn_reservation "athlon_call" 0
140169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
141132718Skan			      (eq_attr "type" "call,callv"))
142132718Skan			 "athlon-vector,athlon-ieu")
143251212Spfg(define_insn_reservation "athlon_call_amdfam10" 0
144251212Spfg			 (and (eq_attr "cpu" "amdfam10")
145251212Spfg			      (eq_attr "type" "call,callv"))
146251212Spfg			 "athlon-double,athlon-ieu")
147117395Skan
148132718Skan;; Latency of push operation is 3 cycles, but ESP value is available
149132718Skan;; earlier
150132718Skan(define_insn_reservation "athlon_push" 2
151251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
152132718Skan			      (eq_attr "type" "push"))
153132718Skan			 "athlon-direct,athlon-agu,athlon-store")
154132718Skan(define_insn_reservation "athlon_pop" 4
155169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
156132718Skan			      (eq_attr "type" "pop"))
157132718Skan			 "athlon-vector,athlon-load,athlon-ieu")
158132718Skan(define_insn_reservation "athlon_pop_k8" 3
159169689Skan			 (and (eq_attr "cpu" "k8,generic64")
160132718Skan			      (eq_attr "type" "pop"))
161132718Skan			 "athlon-double,(athlon-ieu+athlon-load)")
162251212Spfg(define_insn_reservation "athlon_pop_amdfam10" 3
163251212Spfg			 (and (eq_attr "cpu" "amdfam10")
164251212Spfg			      (eq_attr "type" "pop"))
165251212Spfg			 "athlon-direct,(athlon-ieu+athlon-load)")
166132718Skan(define_insn_reservation "athlon_leave" 3
167132718Skan			 (and (eq_attr "cpu" "athlon")
168132718Skan			      (eq_attr "type" "leave"))
169132718Skan			 "athlon-vector,(athlon-ieu+athlon-load)")
170132718Skan(define_insn_reservation "athlon_leave_k8" 3
171251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
172132718Skan			      (eq_attr "type" "leave"))
173132718Skan			 "athlon-double,(athlon-ieu+athlon-load)")
174117395Skan
175132718Skan;; Lea executes in AGU unit with 2 cycles latency.
176132718Skan(define_insn_reservation "athlon_lea" 2
177169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
178132718Skan			      (eq_attr "type" "lea"))
179132718Skan			 "athlon-direct,athlon-agu,nothing")
180251212Spfg;; Lea executes in AGU unit with 1 cycle latency on AMDFAM10
181251212Spfg(define_insn_reservation "athlon_lea_amdfam10" 1
182251212Spfg			 (and (eq_attr "cpu" "amdfam10")
183251212Spfg			      (eq_attr "type" "lea"))
184251212Spfg			 "athlon-direct,athlon-agu,nothing")
185117395Skan
186132718Skan;; Mul executes in special multiplier unit attached to IEU0
187132718Skan(define_insn_reservation "athlon_imul" 5
188132718Skan			 (and (eq_attr "cpu" "athlon")
189132718Skan			      (and (eq_attr "type" "imul")
190132718Skan				   (eq_attr "memory" "none,unknown")))
191132718Skan			 "athlon-vector,athlon-ieu0,athlon-mult,nothing,nothing,athlon-ieu0")
192132718Skan;; ??? Widening multiply is vector or double.
193132718Skan(define_insn_reservation "athlon_imul_k8_DI" 4
194251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
195132718Skan			      (and (eq_attr "type" "imul")
196132718Skan				   (and (eq_attr "mode" "DI")
197132718Skan					(eq_attr "memory" "none,unknown"))))
198132718Skan			 "athlon-direct0,athlon-ieu0,athlon-mult,nothing,athlon-ieu0")
199132718Skan(define_insn_reservation "athlon_imul_k8" 3
200251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
201132718Skan			      (and (eq_attr "type" "imul")
202132718Skan				   (eq_attr "memory" "none,unknown")))
203132718Skan			 "athlon-direct0,athlon-ieu0,athlon-mult,athlon-ieu0")
204251212Spfg(define_insn_reservation "athlon_imul_amdfam10_HI" 4
205251212Spfg			 (and (eq_attr "cpu" "amdfam10")
206251212Spfg			      (and (eq_attr "type" "imul")
207251212Spfg				   (and (eq_attr "mode" "HI")
208251212Spfg					(eq_attr "memory" "none,unknown"))))
209251212Spfg			 "athlon-vector,athlon-ieu0,athlon-mult,nothing,athlon-ieu0")			 
210132718Skan(define_insn_reservation "athlon_imul_mem" 8
211132718Skan			 (and (eq_attr "cpu" "athlon")
212132718Skan			      (and (eq_attr "type" "imul")
213132718Skan				   (eq_attr "memory" "load,both")))
214132718Skan			 "athlon-vector,athlon-load,athlon-ieu,athlon-mult,nothing,nothing,athlon-ieu")
215132718Skan(define_insn_reservation "athlon_imul_mem_k8_DI" 7
216251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
217132718Skan			      (and (eq_attr "type" "imul")
218132718Skan				   (and (eq_attr "mode" "DI")
219132718Skan					(eq_attr "memory" "load,both"))))
220132718Skan			 "athlon-vector,athlon-load,athlon-ieu,athlon-mult,nothing,athlon-ieu")
221132718Skan(define_insn_reservation "athlon_imul_mem_k8" 6
222251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
223132718Skan			      (and (eq_attr "type" "imul")
224132718Skan				   (eq_attr "memory" "load,both")))
225132718Skan			 "athlon-vector,athlon-load,athlon-ieu,athlon-mult,athlon-ieu")
226117395Skan
227169689Skan;; Idiv cannot execute in parallel with other instructions.  Dealing with it
228132718Skan;; as with short latency vector instruction is good approximation avoiding
229132718Skan;; scheduler from trying too hard to can hide it's latency by overlap with
230132718Skan;; other instructions.
231132718Skan;; ??? Experiments show that the idiv can overlap with roughly 6 cycles
232132718Skan;; of the other code
233251212Spfg;; Using the same heuristics for amdfam10 as K8 with idiv
234117395Skan
235132718Skan(define_insn_reservation "athlon_idiv" 6
236251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
237132718Skan			      (and (eq_attr "type" "idiv")
238132718Skan				   (eq_attr "memory" "none,unknown")))
239132718Skan			 "athlon-vector,(athlon-ieu0*6+(athlon-fpsched,athlon-fvector))")
240132718Skan(define_insn_reservation "athlon_idiv_mem" 9
241251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
242132718Skan			      (and (eq_attr "type" "idiv")
243132718Skan				   (eq_attr "memory" "load,both")))
244132718Skan			 "athlon-vector,((athlon-load,athlon-ieu0*6)+(athlon-fpsched,athlon-fvector))")
245132718Skan;; The parallelism of string instructions is not documented.  Model it same way
246132718Skan;; as idiv to create smaller automata.  This probably does not matter much.
247251212Spfg;; Using the same heuristics for amdfam10 as K8 with idiv
248132718Skan(define_insn_reservation "athlon_str" 6
249251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
250132718Skan			      (and (eq_attr "type" "str")
251132718Skan				   (eq_attr "memory" "load,both,store")))
252132718Skan			 "athlon-vector,athlon-load,athlon-ieu0*6")
253117395Skan
254132718Skan(define_insn_reservation "athlon_idirect" 1
255169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
256132718Skan			      (and (eq_attr "athlon_decode" "direct")
257132718Skan				   (and (eq_attr "unit" "integer,unknown")
258132718Skan					(eq_attr "memory" "none,unknown"))))
259132718Skan			 "athlon-direct,athlon-ieu")
260251212Spfg(define_insn_reservation "athlon_idirect_amdfam10" 1
261251212Spfg			 (and (eq_attr "cpu" "amdfam10")
262251212Spfg			      (and (eq_attr "amdfam10_decode" "direct")
263251212Spfg				   (and (eq_attr "unit" "integer,unknown")
264251212Spfg					(eq_attr "memory" "none,unknown"))))
265251212Spfg			 "athlon-direct,athlon-ieu")
266132718Skan(define_insn_reservation "athlon_ivector" 2
267169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
268132718Skan			      (and (eq_attr "athlon_decode" "vector")
269132718Skan				   (and (eq_attr "unit" "integer,unknown")
270132718Skan					(eq_attr "memory" "none,unknown"))))
271132718Skan			 "athlon-vector,athlon-ieu,athlon-ieu")
272251212Spfg(define_insn_reservation "athlon_ivector_amdfam10" 2
273251212Spfg			 (and (eq_attr "cpu" "amdfam10")
274251212Spfg			      (and (eq_attr "amdfam10_decode" "vector")
275251212Spfg				   (and (eq_attr "unit" "integer,unknown")
276251212Spfg					(eq_attr "memory" "none,unknown"))))
277251212Spfg			 "athlon-vector,athlon-ieu,athlon-ieu")
278251212Spfg
279132718Skan(define_insn_reservation "athlon_idirect_loadmov" 3
280251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
281132718Skan			      (and (eq_attr "type" "imov")
282132718Skan				   (eq_attr "memory" "load")))
283132718Skan			 "athlon-direct,athlon-load")
284251212Spfg
285132718Skan(define_insn_reservation "athlon_idirect_load" 4
286169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
287132718Skan			      (and (eq_attr "athlon_decode" "direct")
288132718Skan				   (and (eq_attr "unit" "integer,unknown")
289132718Skan					(eq_attr "memory" "load"))))
290132718Skan			 "athlon-direct,athlon-load,athlon-ieu")
291251212Spfg(define_insn_reservation "athlon_idirect_load_amdfam10" 4
292251212Spfg			 (and (eq_attr "cpu" "amdfam10")
293251212Spfg			      (and (eq_attr "amdfam10_decode" "direct")
294251212Spfg				   (and (eq_attr "unit" "integer,unknown")
295251212Spfg					(eq_attr "memory" "load"))))
296251212Spfg			 "athlon-direct,athlon-load,athlon-ieu")
297132718Skan(define_insn_reservation "athlon_ivector_load" 6
298169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
299132718Skan			      (and (eq_attr "athlon_decode" "vector")
300132718Skan				   (and (eq_attr "unit" "integer,unknown")
301132718Skan					(eq_attr "memory" "load"))))
302132718Skan			 "athlon-vector,athlon-load,athlon-ieu,athlon-ieu")
303251212Spfg(define_insn_reservation "athlon_ivector_load_amdfam10" 6
304251212Spfg			 (and (eq_attr "cpu" "amdfam10")
305251212Spfg			      (and (eq_attr "amdfam10_decode" "vector")
306251212Spfg				   (and (eq_attr "unit" "integer,unknown")
307251212Spfg					(eq_attr "memory" "load"))))
308251212Spfg			 "athlon-vector,athlon-load,athlon-ieu,athlon-ieu")
309251212Spfg
310132718Skan(define_insn_reservation "athlon_idirect_movstore" 1
311251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
312132718Skan			      (and (eq_attr "type" "imov")
313132718Skan				   (eq_attr "memory" "store")))
314132718Skan			 "athlon-direct,athlon-agu,athlon-store")
315251212Spfg
316132718Skan(define_insn_reservation "athlon_idirect_both" 4
317169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
318132718Skan			      (and (eq_attr "athlon_decode" "direct")
319132718Skan				   (and (eq_attr "unit" "integer,unknown")
320132718Skan					(eq_attr "memory" "both"))))
321132718Skan			 "athlon-direct,athlon-load,
322132718Skan			  athlon-ieu,athlon-store,
323132718Skan			  athlon-store")
324251212Spfg(define_insn_reservation "athlon_idirect_both_amdfam10" 4
325251212Spfg			 (and (eq_attr "cpu" "amdfam10")
326251212Spfg			      (and (eq_attr "amdfam10_decode" "direct")
327251212Spfg				   (and (eq_attr "unit" "integer,unknown")
328251212Spfg					(eq_attr "memory" "both"))))
329251212Spfg			 "athlon-direct,athlon-load,
330251212Spfg			  athlon-ieu,athlon-store,
331251212Spfg			  athlon-store")			  
332251212Spfg
333132718Skan(define_insn_reservation "athlon_ivector_both" 6
334169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
335132718Skan			      (and (eq_attr "athlon_decode" "vector")
336132718Skan				   (and (eq_attr "unit" "integer,unknown")
337132718Skan					(eq_attr "memory" "both"))))
338132718Skan			 "athlon-vector,athlon-load,
339132718Skan			  athlon-ieu,
340132718Skan			  athlon-ieu,
341132718Skan			  athlon-store")
342251212Spfg(define_insn_reservation "athlon_ivector_both_amdfam10" 6
343251212Spfg			 (and (eq_attr "cpu" "amdfam10")
344251212Spfg			      (and (eq_attr "amdfam10_decode" "vector")
345251212Spfg				   (and (eq_attr "unit" "integer,unknown")
346251212Spfg					(eq_attr "memory" "both"))))
347251212Spfg			 "athlon-vector,athlon-load,
348251212Spfg			  athlon-ieu,
349251212Spfg			  athlon-ieu,
350251212Spfg			  athlon-store")
351251212Spfg
352132718Skan(define_insn_reservation "athlon_idirect_store" 1
353169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
354132718Skan			      (and (eq_attr "athlon_decode" "direct")
355132718Skan				   (and (eq_attr "unit" "integer,unknown")
356132718Skan					(eq_attr "memory" "store"))))
357132718Skan			 "athlon-direct,(athlon-ieu+athlon-agu),
358132718Skan			  athlon-store")
359251212Spfg(define_insn_reservation "athlon_idirect_store_amdfam10" 1
360251212Spfg			 (and (eq_attr "cpu" "amdfam10")
361251212Spfg			      (and (eq_attr "amdfam10_decode" "direct")
362251212Spfg				   (and (eq_attr "unit" "integer,unknown")
363251212Spfg					(eq_attr "memory" "store"))))
364251212Spfg			 "athlon-direct,(athlon-ieu+athlon-agu),
365251212Spfg			  athlon-store")
366251212Spfg
367132718Skan(define_insn_reservation "athlon_ivector_store" 2
368169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
369132718Skan			      (and (eq_attr "athlon_decode" "vector")
370132718Skan				   (and (eq_attr "unit" "integer,unknown")
371132718Skan					(eq_attr "memory" "store"))))
372132718Skan			 "athlon-vector,(athlon-ieu+athlon-agu),athlon-ieu,
373132718Skan			  athlon-store")
374251212Spfg(define_insn_reservation "athlon_ivector_store_amdfam10" 2
375251212Spfg			 (and (eq_attr "cpu" "amdfam10")
376251212Spfg			      (and (eq_attr "amdfam10_decode" "vector")
377251212Spfg				   (and (eq_attr "unit" "integer,unknown")
378251212Spfg					(eq_attr "memory" "store"))))
379251212Spfg			 "athlon-vector,(athlon-ieu+athlon-agu),athlon-ieu,
380251212Spfg			  athlon-store")
381117395Skan
382132718Skan;; Athlon floatin point unit
383132718Skan(define_insn_reservation "athlon_fldxf" 12
384132718Skan			 (and (eq_attr "cpu" "athlon")
385132718Skan			      (and (eq_attr "type" "fmov")
386132718Skan				   (and (eq_attr "memory" "load")
387132718Skan					(eq_attr "mode" "XF"))))
388132718Skan			 "athlon-vector,athlon-fpload2,athlon-fvector*9")
389132718Skan(define_insn_reservation "athlon_fldxf_k8" 13
390251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
391132718Skan			      (and (eq_attr "type" "fmov")
392132718Skan				   (and (eq_attr "memory" "load")
393132718Skan					(eq_attr "mode" "XF"))))
394132718Skan			 "athlon-vector,athlon-fpload2k8,athlon-fvector*9")
395132718Skan;; Assume superforwarding to take place so effective latency of fany op is 0.
396132718Skan(define_insn_reservation "athlon_fld" 0
397132718Skan			 (and (eq_attr "cpu" "athlon")
398132718Skan			      (and (eq_attr "type" "fmov")
399132718Skan				   (eq_attr "memory" "load")))
400132718Skan			 "athlon-direct,athlon-fpload,athlon-fany")
401132718Skan(define_insn_reservation "athlon_fld_k8" 2
402251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
403132718Skan			      (and (eq_attr "type" "fmov")
404132718Skan				   (eq_attr "memory" "load")))
405132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fstore")
406117395Skan
407132718Skan(define_insn_reservation "athlon_fstxf" 10
408132718Skan			 (and (eq_attr "cpu" "athlon")
409132718Skan			      (and (eq_attr "type" "fmov")
410132718Skan				   (and (eq_attr "memory" "store,both")
411132718Skan					(eq_attr "mode" "XF"))))
412132718Skan			 "athlon-vector,(athlon-fpsched+athlon-agu),(athlon-store2+(athlon-fvector*7))")
413132718Skan(define_insn_reservation "athlon_fstxf_k8" 8
414251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
415132718Skan			      (and (eq_attr "type" "fmov")
416132718Skan				   (and (eq_attr "memory" "store,both")
417132718Skan					(eq_attr "mode" "XF"))))
418132718Skan			 "athlon-vector,(athlon-fpsched+athlon-agu),(athlon-store2+(athlon-fvector*6))")
419132718Skan(define_insn_reservation "athlon_fst" 4
420132718Skan			 (and (eq_attr "cpu" "athlon")
421132718Skan			      (and (eq_attr "type" "fmov")
422132718Skan				   (eq_attr "memory" "store,both")))
423132718Skan			 "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
424132718Skan(define_insn_reservation "athlon_fst_k8" 2
425251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
426132718Skan			      (and (eq_attr "type" "fmov")
427132718Skan				   (eq_attr "memory" "store,both")))
428132718Skan			 "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
429132718Skan(define_insn_reservation "athlon_fist" 4
430251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
431169689Skan			      (eq_attr "type" "fistp,fisttp"))
432132718Skan			 "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
433132718Skan(define_insn_reservation "athlon_fmov" 2
434251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
435132718Skan			      (eq_attr "type" "fmov"))
436132718Skan			 "athlon-direct,athlon-fpsched,athlon-faddmul")
437132718Skan(define_insn_reservation "athlon_fadd_load" 4
438132718Skan			 (and (eq_attr "cpu" "athlon")
439132718Skan			      (and (eq_attr "type" "fop")
440132718Skan				   (eq_attr "memory" "load")))
441132718Skan			 "athlon-direct,athlon-fpload,athlon-fadd")
442132718Skan(define_insn_reservation "athlon_fadd_load_k8" 6
443251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
444132718Skan			      (and (eq_attr "type" "fop")
445132718Skan				   (eq_attr "memory" "load")))
446132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fadd")
447132718Skan(define_insn_reservation "athlon_fadd" 4
448251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
449132718Skan			      (eq_attr "type" "fop"))
450132718Skan			 "athlon-direct,athlon-fpsched,athlon-fadd")
451132718Skan(define_insn_reservation "athlon_fmul_load" 4
452132718Skan			 (and (eq_attr "cpu" "athlon")
453132718Skan			      (and (eq_attr "type" "fmul")
454132718Skan				   (eq_attr "memory" "load")))
455132718Skan			 "athlon-direct,athlon-fpload,athlon-fmul")
456132718Skan(define_insn_reservation "athlon_fmul_load_k8" 6
457251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
458132718Skan			      (and (eq_attr "type" "fmul")
459132718Skan				   (eq_attr "memory" "load")))
460132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fmul")
461132718Skan(define_insn_reservation "athlon_fmul" 4
462251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
463132718Skan			      (eq_attr "type" "fmul"))
464132718Skan			 "athlon-direct,athlon-fpsched,athlon-fmul")
465132718Skan(define_insn_reservation "athlon_fsgn" 2
466251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
467132718Skan			      (eq_attr "type" "fsgn"))
468132718Skan			 "athlon-direct,athlon-fpsched,athlon-fmul")
469132718Skan(define_insn_reservation "athlon_fdiv_load" 24
470132718Skan			 (and (eq_attr "cpu" "athlon")
471132718Skan			      (and (eq_attr "type" "fdiv")
472132718Skan				   (eq_attr "memory" "load")))
473132718Skan			 "athlon-direct,athlon-fpload,athlon-fmul")
474132718Skan(define_insn_reservation "athlon_fdiv_load_k8" 13
475251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
476132718Skan			      (and (eq_attr "type" "fdiv")
477132718Skan				   (eq_attr "memory" "load")))
478132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fmul")
479132718Skan(define_insn_reservation "athlon_fdiv" 24
480132718Skan			 (and (eq_attr "cpu" "athlon")
481132718Skan			      (eq_attr "type" "fdiv"))
482132718Skan			 "athlon-direct,athlon-fpsched,athlon-fmul")
483132718Skan(define_insn_reservation "athlon_fdiv_k8" 11
484251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
485132718Skan			      (eq_attr "type" "fdiv"))
486132718Skan			 "athlon-direct,athlon-fpsched,athlon-fmul")
487132718Skan(define_insn_reservation "athlon_fpspc_load" 103
488251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
489132718Skan			      (and (eq_attr "type" "fpspc")
490132718Skan				   (eq_attr "memory" "load")))
491132718Skan			 "athlon-vector,athlon-fpload,athlon-fvector")
492132718Skan(define_insn_reservation "athlon_fpspc" 100
493251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
494132718Skan			      (eq_attr "type" "fpspc"))
495132718Skan			 "athlon-vector,athlon-fpsched,athlon-fvector")
496132718Skan(define_insn_reservation "athlon_fcmov_load" 7
497132718Skan			 (and (eq_attr "cpu" "athlon")
498132718Skan			      (and (eq_attr "type" "fcmov")
499132718Skan				   (eq_attr "memory" "load")))
500132718Skan			 "athlon-vector,athlon-fpload,athlon-fvector")
501132718Skan(define_insn_reservation "athlon_fcmov" 7
502132718Skan			 (and (eq_attr "cpu" "athlon")
503132718Skan			      (eq_attr "type" "fcmov"))
504132718Skan			 "athlon-vector,athlon-fpsched,athlon-fvector")
505132718Skan(define_insn_reservation "athlon_fcmov_load_k8" 17
506251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
507132718Skan			      (and (eq_attr "type" "fcmov")
508132718Skan				   (eq_attr "memory" "load")))
509132718Skan			 "athlon-vector,athlon-fploadk8,athlon-fvector")
510132718Skan(define_insn_reservation "athlon_fcmov_k8" 15
511251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
512132718Skan			      (eq_attr "type" "fcmov"))
513132718Skan			 "athlon-vector,athlon-fpsched,athlon-fvector")
514132718Skan;; fcomi is vector decoded by uses only one pipe.
515132718Skan(define_insn_reservation "athlon_fcomi_load" 3
516132718Skan			 (and (eq_attr "cpu" "athlon")
517132718Skan			      (and (eq_attr "type" "fcmp")
518132718Skan				   (and (eq_attr "athlon_decode" "vector")
519132718Skan				        (eq_attr "memory" "load"))))
520132718Skan			 "athlon-vector,athlon-fpload,athlon-fadd")
521132718Skan(define_insn_reservation "athlon_fcomi_load_k8" 5
522251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
523132718Skan			      (and (eq_attr "type" "fcmp")
524132718Skan				   (and (eq_attr "athlon_decode" "vector")
525132718Skan				        (eq_attr "memory" "load"))))
526132718Skan			 "athlon-vector,athlon-fploadk8,athlon-fadd")
527132718Skan(define_insn_reservation "athlon_fcomi" 3
528251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
529132718Skan			      (and (eq_attr "athlon_decode" "vector")
530132718Skan				   (eq_attr "type" "fcmp")))
531132718Skan			 "athlon-vector,athlon-fpsched,athlon-fadd")
532132718Skan(define_insn_reservation "athlon_fcom_load" 2
533132718Skan			 (and (eq_attr "cpu" "athlon")
534132718Skan			      (and (eq_attr "type" "fcmp")
535132718Skan				   (eq_attr "memory" "load")))
536132718Skan			 "athlon-direct,athlon-fpload,athlon-fadd")
537132718Skan(define_insn_reservation "athlon_fcom_load_k8" 4
538251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
539132718Skan			      (and (eq_attr "type" "fcmp")
540132718Skan				   (eq_attr "memory" "load")))
541132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fadd")
542132718Skan(define_insn_reservation "athlon_fcom" 2
543251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
544132718Skan			      (eq_attr "type" "fcmp"))
545132718Skan			 "athlon-direct,athlon-fpsched,athlon-fadd")
546132718Skan;; Never seen by the scheduler because we still don't do post reg-stack
547132718Skan;; scheduling.
548132718Skan;(define_insn_reservation "athlon_fxch" 2
549251212Spfg;			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
550132718Skan;			      (eq_attr "type" "fxch"))
551132718Skan;			 "athlon-direct,athlon-fpsched,athlon-fany")
552117395Skan
553132718Skan;; Athlon handle MMX operations in the FPU unit with shorter latencies
554117395Skan
555132718Skan(define_insn_reservation "athlon_movlpd_load" 0
556132718Skan			 (and (eq_attr "cpu" "athlon")
557132718Skan			      (and (eq_attr "type" "ssemov")
558132718Skan				   (match_operand:DF 1 "memory_operand" "")))
559132718Skan			 "athlon-direct,athlon-fpload,athlon-fany")
560132718Skan(define_insn_reservation "athlon_movlpd_load_k8" 2
561132718Skan			 (and (eq_attr "cpu" "k8")
562132718Skan			      (and (eq_attr "type" "ssemov")
563132718Skan				   (match_operand:DF 1 "memory_operand" "")))
564132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fstore")
565169689Skan(define_insn_reservation "athlon_movsd_load_generic64" 2
566169689Skan			 (and (eq_attr "cpu" "generic64")
567169689Skan			      (and (eq_attr "type" "ssemov")
568169689Skan				   (match_operand:DF 1 "memory_operand" "")))
569169689Skan			 "athlon-double,athlon-fploadk8,(athlon-fstore+athlon-fmul)")
570132718Skan(define_insn_reservation "athlon_movaps_load_k8" 2
571169689Skan			 (and (eq_attr "cpu" "k8,generic64")
572132718Skan			      (and (eq_attr "type" "ssemov")
573132718Skan				   (and (eq_attr "mode" "V4SF,V2DF,TI")
574132718Skan					(eq_attr "memory" "load"))))
575132718Skan			 "athlon-double,athlon-fpload2k8,athlon-fstore,athlon-fstore")
576132718Skan(define_insn_reservation "athlon_movaps_load" 0
577132718Skan			 (and (eq_attr "cpu" "athlon")
578132718Skan			      (and (eq_attr "type" "ssemov")
579132718Skan				   (and (eq_attr "mode" "V4SF,V2DF,TI")
580132718Skan					(eq_attr "memory" "load"))))
581132718Skan			 "athlon-vector,athlon-fpload2,(athlon-fany+athlon-fany)")
582132718Skan(define_insn_reservation "athlon_movss_load" 1
583132718Skan			 (and (eq_attr "cpu" "athlon")
584132718Skan			      (and (eq_attr "type" "ssemov")
585132718Skan				   (and (eq_attr "mode" "SF,DI")
586132718Skan					(eq_attr "memory" "load"))))
587132718Skan			 "athlon-vector,athlon-fpload,(athlon-fany*2)")
588132718Skan(define_insn_reservation "athlon_movss_load_k8" 1
589169689Skan			 (and (eq_attr "cpu" "k8,generic64")
590132718Skan			      (and (eq_attr "type" "ssemov")
591132718Skan				   (and (eq_attr "mode" "SF,DI")
592132718Skan					(eq_attr "memory" "load"))))
593132718Skan			 "athlon-double,athlon-fploadk8,(athlon-fstore+athlon-fany)")
594132718Skan(define_insn_reservation "athlon_mmxsseld" 0
595132718Skan			 (and (eq_attr "cpu" "athlon")
596132718Skan			      (and (eq_attr "type" "mmxmov,ssemov")
597132718Skan				   (eq_attr "memory" "load")))
598132718Skan			 "athlon-direct,athlon-fpload,athlon-fany")
599132718Skan(define_insn_reservation "athlon_mmxsseld_k8" 2
600169689Skan			 (and (eq_attr "cpu" "k8,generic64")
601132718Skan			      (and (eq_attr "type" "mmxmov,ssemov")
602132718Skan				   (eq_attr "memory" "load")))
603132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fstore")
604251212Spfg;; On AMDFAM10 all double, single and integer packed and scalar SSEx data
605251212Spfg;; loads  generated are direct path, latency of 2 and do not use any FP
606251212Spfg;; executions units. No seperate entries for movlpx/movhpx loads, which
607251212Spfg;; are direct path, latency of 4 and use the FADD/FMUL FP execution units,
608251212Spfg;; as they will not be generated.
609251212Spfg(define_insn_reservation "athlon_sseld_amdfam10" 2
610251212Spfg			 (and (eq_attr "cpu" "amdfam10")
611251212Spfg			      (and (eq_attr "type" "ssemov")
612251212Spfg				   (eq_attr "memory" "load")))
613251212Spfg			 "athlon-direct,athlon-fploadk8")
614251212Spfg;; On AMDFAM10 MMX data loads  generated are direct path, latency of 4
615251212Spfg;; and can use any  FP executions units
616251212Spfg(define_insn_reservation "athlon_mmxld_amdfam10" 4
617251212Spfg			 (and (eq_attr "cpu" "amdfam10")
618251212Spfg			      (and (eq_attr "type" "mmxmov")
619251212Spfg				   (eq_attr "memory" "load")))
620251212Spfg			 "athlon-direct,athlon-fploadk8, athlon-fany")			 
621132718Skan(define_insn_reservation "athlon_mmxssest" 3
622169689Skan			 (and (eq_attr "cpu" "k8,generic64")
623132718Skan			      (and (eq_attr "type" "mmxmov,ssemov")
624132718Skan				   (and (eq_attr "mode" "V4SF,V2DF,TI")
625132718Skan					(eq_attr "memory" "store,both"))))
626132718Skan			 "athlon-vector,(athlon-fpsched+athlon-agu),((athlon-fstore+athlon-store2)*2)")
627132718Skan(define_insn_reservation "athlon_mmxssest_k8" 3
628169689Skan			 (and (eq_attr "cpu" "k8,generic64")
629132718Skan			      (and (eq_attr "type" "mmxmov,ssemov")
630132718Skan				   (and (eq_attr "mode" "V4SF,V2DF,TI")
631132718Skan					(eq_attr "memory" "store,both"))))
632132718Skan			 "athlon-double,(athlon-fpsched+athlon-agu),((athlon-fstore+athlon-store2)*2)")
633132718Skan(define_insn_reservation "athlon_mmxssest_short" 2
634169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
635132718Skan			      (and (eq_attr "type" "mmxmov,ssemov")
636132718Skan				   (eq_attr "memory" "store,both")))
637132718Skan			 "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
638251212Spfg;; On AMDFAM10 all double, single and integer packed SSEx data stores
639251212Spfg;; generated are all double path, latency of 2 and use the FSTORE FP
640251212Spfg;; execution unit. No entries seperate for movupx/movdqu, which are
641251212Spfg;; vector path, latency of 3 and use the FSTORE*2 FP execution unit,
642251212Spfg;; as they will not be generated.
643251212Spfg(define_insn_reservation "athlon_ssest_amdfam10" 2
644251212Spfg			 (and (eq_attr "cpu" "amdfam10")
645251212Spfg			      (and (eq_attr "type" "ssemov")
646251212Spfg				   (and (eq_attr "mode" "V4SF,V2DF,TI")
647251212Spfg					(eq_attr "memory" "store,both"))))
648251212Spfg			 "athlon-double,(athlon-fpsched+athlon-agu),((athlon-fstore+athlon-store)*2)")
649251212Spfg;; On AMDFAM10 all double, single and integer scalar SSEx and MMX
650251212Spfg;; data stores generated are all direct path, latency of 2 and use
651251212Spfg;; the FSTORE FP execution unit
652251212Spfg(define_insn_reservation "athlon_mmxssest_short_amdfam10" 2
653251212Spfg			 (and (eq_attr "cpu" "amdfam10")
654251212Spfg			      (and (eq_attr "type" "mmxmov,ssemov")
655251212Spfg				   (eq_attr "memory" "store,both")))
656251212Spfg			 "athlon-direct,(athlon-fpsched+athlon-agu),(athlon-fstore+athlon-store)")
657169689Skan(define_insn_reservation "athlon_movaps_k8" 2
658169689Skan			 (and (eq_attr "cpu" "k8,generic64")
659132718Skan			      (and (eq_attr "type" "ssemov")
660132718Skan				   (eq_attr "mode" "V4SF,V2DF,TI")))
661169689Skan			 "athlon-double,athlon-fpsched,((athlon-faddmul+athlon-faddmul) | (athlon-faddmul, athlon-faddmul))")
662169689Skan(define_insn_reservation "athlon_movaps" 2
663132718Skan			 (and (eq_attr "cpu" "athlon")
664132718Skan			      (and (eq_attr "type" "ssemov")
665132718Skan				   (eq_attr "mode" "V4SF,V2DF,TI")))
666132718Skan			 "athlon-vector,athlon-fpsched,(athlon-faddmul+athlon-faddmul)")
667132718Skan(define_insn_reservation "athlon_mmxssemov" 2
668169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
669132718Skan			      (eq_attr "type" "mmxmov,ssemov"))
670132718Skan			 "athlon-direct,athlon-fpsched,athlon-faddmul")
671132718Skan(define_insn_reservation "athlon_mmxmul_load" 4
672169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
673132718Skan			      (and (eq_attr "type" "mmxmul")
674132718Skan				   (eq_attr "memory" "load")))
675132718Skan			 "athlon-direct,athlon-fpload,athlon-fmul")
676132718Skan(define_insn_reservation "athlon_mmxmul" 3
677169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
678132718Skan			      (eq_attr "type" "mmxmul"))
679132718Skan			 "athlon-direct,athlon-fpsched,athlon-fmul")
680132718Skan(define_insn_reservation "athlon_mmx_load" 3
681169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
682132718Skan			      (and (eq_attr "unit" "mmx")
683132718Skan				   (eq_attr "memory" "load")))
684132718Skan			 "athlon-direct,athlon-fpload,athlon-faddmul")
685132718Skan(define_insn_reservation "athlon_mmx" 2
686169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
687132718Skan			      (eq_attr "unit" "mmx"))
688132718Skan			 "athlon-direct,athlon-fpsched,athlon-faddmul")
689132718Skan;; SSE operations are handled by the i387 unit as well.  The latency
690132718Skan;; is same as for i387 operations for scalar operations
691117395Skan
692132718Skan(define_insn_reservation "athlon_sselog_load" 3
693132718Skan			 (and (eq_attr "cpu" "athlon")
694169689Skan			      (and (eq_attr "type" "sselog,sselog1")
695132718Skan				   (eq_attr "memory" "load")))
696132718Skan			 "athlon-vector,athlon-fpload2,(athlon-fmul*2)")
697132718Skan(define_insn_reservation "athlon_sselog_load_k8" 5
698169689Skan			 (and (eq_attr "cpu" "k8,generic64")
699169689Skan			      (and (eq_attr "type" "sselog,sselog1")
700132718Skan				   (eq_attr "memory" "load")))
701132718Skan			 "athlon-double,athlon-fpload2k8,(athlon-fmul*2)")
702251212Spfg(define_insn_reservation "athlon_sselog_load_amdfam10" 4
703251212Spfg			 (and (eq_attr "cpu" "amdfam10")
704251212Spfg			      (and (eq_attr "type" "sselog,sselog1")
705251212Spfg				   (eq_attr "memory" "load")))
706251212Spfg			 "athlon-direct,athlon-fploadk8,(athlon-fadd|athlon-fmul)")
707132718Skan(define_insn_reservation "athlon_sselog" 3
708132718Skan			 (and (eq_attr "cpu" "athlon")
709169689Skan			      (eq_attr "type" "sselog,sselog1"))
710132718Skan			 "athlon-vector,athlon-fpsched,athlon-fmul*2")
711132718Skan(define_insn_reservation "athlon_sselog_k8" 3
712169689Skan			 (and (eq_attr "cpu" "k8,generic64")
713169689Skan			      (eq_attr "type" "sselog,sselog1"))
714132718Skan			 "athlon-double,athlon-fpsched,athlon-fmul")
715251212Spfg(define_insn_reservation "athlon_sselog_amdfam10" 2
716251212Spfg			 (and (eq_attr "cpu" "amdfam10")
717251212Spfg			      (eq_attr "type" "sselog,sselog1"))
718251212Spfg			 "athlon-direct,athlon-fpsched,(athlon-fadd|athlon-fmul)")
719251212Spfg
720169689Skan;; ??? pcmp executes in addmul, probably not worthwhile to bother about that.
721132718Skan(define_insn_reservation "athlon_ssecmp_load" 2
722132718Skan			 (and (eq_attr "cpu" "athlon")
723132718Skan			      (and (eq_attr "type" "ssecmp")
724132718Skan				   (and (eq_attr "mode" "SF,DF,DI")
725132718Skan					(eq_attr "memory" "load"))))
726132718Skan			 "athlon-direct,athlon-fpload,athlon-fadd")
727132718Skan(define_insn_reservation "athlon_ssecmp_load_k8" 4
728251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
729132718Skan			      (and (eq_attr "type" "ssecmp")
730132718Skan				   (and (eq_attr "mode" "SF,DF,DI,TI")
731132718Skan					(eq_attr "memory" "load"))))
732132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fadd")
733132718Skan(define_insn_reservation "athlon_ssecmp" 2
734251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
735132718Skan			      (and (eq_attr "type" "ssecmp")
736132718Skan				   (eq_attr "mode" "SF,DF,DI,TI")))
737132718Skan			 "athlon-direct,athlon-fpsched,athlon-fadd")
738132718Skan(define_insn_reservation "athlon_ssecmpvector_load" 3
739132718Skan			 (and (eq_attr "cpu" "athlon")
740132718Skan			      (and (eq_attr "type" "ssecmp")
741132718Skan				   (eq_attr "memory" "load")))
742132718Skan			 "athlon-vector,athlon-fpload2,(athlon-fadd*2)")
743132718Skan(define_insn_reservation "athlon_ssecmpvector_load_k8" 5
744169689Skan			 (and (eq_attr "cpu" "k8,generic64")
745132718Skan			      (and (eq_attr "type" "ssecmp")
746132718Skan				   (eq_attr "memory" "load")))
747132718Skan			 "athlon-double,athlon-fpload2k8,(athlon-fadd*2)")
748251212Spfg(define_insn_reservation "athlon_ssecmpvector_load_amdfam10" 4
749251212Spfg			 (and (eq_attr "cpu" "amdfam10")
750251212Spfg			      (and (eq_attr "type" "ssecmp")
751251212Spfg				   (eq_attr "memory" "load")))
752251212Spfg			 "athlon-direct,athlon-fploadk8,athlon-fadd")
753132718Skan(define_insn_reservation "athlon_ssecmpvector" 3
754132718Skan			 (and (eq_attr "cpu" "athlon")
755132718Skan			      (eq_attr "type" "ssecmp"))
756132718Skan			 "athlon-vector,athlon-fpsched,(athlon-fadd*2)")
757132718Skan(define_insn_reservation "athlon_ssecmpvector_k8" 3
758169689Skan			 (and (eq_attr "cpu" "k8,generic64")
759132718Skan			      (eq_attr "type" "ssecmp"))
760132718Skan			 "athlon-double,athlon-fpsched,(athlon-fadd*2)")
761251212Spfg(define_insn_reservation "athlon_ssecmpvector_amdfam10" 2
762251212Spfg			 (and (eq_attr "cpu" "amdfam10")
763251212Spfg			      (eq_attr "type" "ssecmp"))
764251212Spfg			 "athlon-direct,athlon-fpsched,athlon-fadd")
765132718Skan(define_insn_reservation "athlon_ssecomi_load" 4
766132718Skan			 (and (eq_attr "cpu" "athlon")
767132718Skan			      (and (eq_attr "type" "ssecomi")
768132718Skan				   (eq_attr "memory" "load")))
769132718Skan			 "athlon-vector,athlon-fpload,athlon-fadd")
770132718Skan(define_insn_reservation "athlon_ssecomi_load_k8" 6
771169689Skan			 (and (eq_attr "cpu" "k8,generic64")
772132718Skan			      (and (eq_attr "type" "ssecomi")
773132718Skan				   (eq_attr "memory" "load")))
774132718Skan			 "athlon-vector,athlon-fploadk8,athlon-fadd")
775251212Spfg(define_insn_reservation "athlon_ssecomi_load_amdfam10" 5
776251212Spfg			 (and (eq_attr "cpu" "amdfam10")
777251212Spfg			      (and (eq_attr "type" "ssecomi")
778251212Spfg				   (eq_attr "memory" "load")))
779251212Spfg			 "athlon-direct,athlon-fploadk8,athlon-fadd")
780132718Skan(define_insn_reservation "athlon_ssecomi" 4
781169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
782132718Skan			      (eq_attr "type" "ssecmp"))
783132718Skan			 "athlon-vector,athlon-fpsched,athlon-fadd")
784251212Spfg(define_insn_reservation "athlon_ssecomi_amdfam10" 3
785251212Spfg			 (and (eq_attr "cpu" "amdfam10")
786251212Spfg;; It seems athlon_ssecomi has a bug in the attr_type, fixed for amdfam10
787251212Spfg			      (eq_attr "type" "ssecomi"))
788251212Spfg			 "athlon-direct,athlon-fpsched,athlon-fadd")
789132718Skan(define_insn_reservation "athlon_sseadd_load" 4
790132718Skan			 (and (eq_attr "cpu" "athlon")
791132718Skan			      (and (eq_attr "type" "sseadd")
792132718Skan				   (and (eq_attr "mode" "SF,DF,DI")
793132718Skan					(eq_attr "memory" "load"))))
794132718Skan			 "athlon-direct,athlon-fpload,athlon-fadd")
795132718Skan(define_insn_reservation "athlon_sseadd_load_k8" 6
796251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
797132718Skan			      (and (eq_attr "type" "sseadd")
798132718Skan				   (and (eq_attr "mode" "SF,DF,DI")
799132718Skan					(eq_attr "memory" "load"))))
800132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fadd")
801132718Skan(define_insn_reservation "athlon_sseadd" 4
802251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
803132718Skan			      (and (eq_attr "type" "sseadd")
804132718Skan				   (eq_attr "mode" "SF,DF,DI")))
805132718Skan			 "athlon-direct,athlon-fpsched,athlon-fadd")
806132718Skan(define_insn_reservation "athlon_sseaddvector_load" 5
807132718Skan			 (and (eq_attr "cpu" "athlon")
808132718Skan			      (and (eq_attr "type" "sseadd")
809132718Skan				   (eq_attr "memory" "load")))
810132718Skan			 "athlon-vector,athlon-fpload2,(athlon-fadd*2)")
811132718Skan(define_insn_reservation "athlon_sseaddvector_load_k8" 7
812169689Skan			 (and (eq_attr "cpu" "k8,generic64")
813132718Skan			      (and (eq_attr "type" "sseadd")
814132718Skan				   (eq_attr "memory" "load")))
815132718Skan			 "athlon-double,athlon-fpload2k8,(athlon-fadd*2)")
816251212Spfg(define_insn_reservation "athlon_sseaddvector_load_amdfam10" 6
817251212Spfg			 (and (eq_attr "cpu" "amdfam10")
818251212Spfg			      (and (eq_attr "type" "sseadd")
819251212Spfg				   (eq_attr "memory" "load")))
820251212Spfg			 "athlon-direct,athlon-fploadk8,athlon-fadd")
821132718Skan(define_insn_reservation "athlon_sseaddvector" 5
822132718Skan			 (and (eq_attr "cpu" "athlon")
823132718Skan			      (eq_attr "type" "sseadd"))
824132718Skan			 "athlon-vector,athlon-fpsched,(athlon-fadd*2)")
825132718Skan(define_insn_reservation "athlon_sseaddvector_k8" 5
826169689Skan			 (and (eq_attr "cpu" "k8,generic64")
827132718Skan			      (eq_attr "type" "sseadd"))
828132718Skan			 "athlon-double,athlon-fpsched,(athlon-fadd*2)")
829251212Spfg(define_insn_reservation "athlon_sseaddvector_amdfam10" 4
830251212Spfg			 (and (eq_attr "cpu" "amdfam10")
831251212Spfg			      (eq_attr "type" "sseadd"))
832251212Spfg			 "athlon-direct,athlon-fpsched,athlon-fadd")
833117395Skan
834132718Skan;; Conversions behaves very irregularly and the scheduling is critical here.
835132718Skan;; Take each instruction separately.  Assume that the mode is always set to the
836132718Skan;; destination one and athlon_decode is set to the K8 versions.
837117395Skan
838132718Skan;; cvtss2sd
839132718Skan(define_insn_reservation "athlon_ssecvt_cvtss2sd_load_k8" 4
840169689Skan			 (and (eq_attr "cpu" "k8,athlon,generic64")
841132718Skan			      (and (eq_attr "type" "ssecvt")
842132718Skan				   (and (eq_attr "athlon_decode" "direct")
843132718Skan					(and (eq_attr "mode" "DF")
844132718Skan					     (eq_attr "memory" "load")))))
845132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fstore")
846251212Spfg(define_insn_reservation "athlon_ssecvt_cvtss2sd_load_amdfam10" 7
847251212Spfg			 (and (eq_attr "cpu" "amdfam10")
848251212Spfg			      (and (eq_attr "type" "ssecvt")
849251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
850251212Spfg					(and (eq_attr "mode" "DF")
851251212Spfg					     (eq_attr "memory" "load")))))
852251212Spfg			 "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
853132718Skan(define_insn_reservation "athlon_ssecvt_cvtss2sd" 2
854169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
855132718Skan			      (and (eq_attr "type" "ssecvt")
856132718Skan				   (and (eq_attr "athlon_decode" "direct")
857132718Skan					(eq_attr "mode" "DF"))))
858132718Skan			 "athlon-direct,athlon-fpsched,athlon-fstore")
859251212Spfg(define_insn_reservation "athlon_ssecvt_cvtss2sd_amdfam10" 7
860251212Spfg			 (and (eq_attr "cpu" "amdfam10")
861251212Spfg			      (and (eq_attr "type" "ssecvt")
862251212Spfg				   (and (eq_attr "amdfam10_decode" "vector")
863251212Spfg					(eq_attr "mode" "DF"))))
864251212Spfg			 "athlon-vector,athlon-fpsched,athlon-faddmul,(athlon-fstore*2)")
865132718Skan;; cvtps2pd.  Model same way the other double decoded FP conversions.
866132718Skan(define_insn_reservation "athlon_ssecvt_cvtps2pd_load_k8" 5
867169689Skan			 (and (eq_attr "cpu" "k8,athlon,generic64")
868132718Skan			      (and (eq_attr "type" "ssecvt")
869132718Skan				   (and (eq_attr "athlon_decode" "double")
870132718Skan					(and (eq_attr "mode" "V2DF,V4SF,TI")
871132718Skan					     (eq_attr "memory" "load")))))
872132718Skan			 "athlon-double,athlon-fpload2k8,(athlon-fstore*2)")
873251212Spfg(define_insn_reservation "athlon_ssecvt_cvtps2pd_load_amdfam10" 4
874251212Spfg			 (and (eq_attr "cpu" "amdfam10")
875251212Spfg			      (and (eq_attr "type" "ssecvt")
876251212Spfg				   (and (eq_attr "amdfam10_decode" "direct")
877251212Spfg					(and (eq_attr "mode" "V2DF,V4SF,TI")
878251212Spfg					     (eq_attr "memory" "load")))))
879251212Spfg			 "athlon-direct,athlon-fploadk8,athlon-fstore")
880132718Skan(define_insn_reservation "athlon_ssecvt_cvtps2pd_k8" 3
881169689Skan			 (and (eq_attr "cpu" "k8,athlon,generic64")
882132718Skan			      (and (eq_attr "type" "ssecvt")
883132718Skan				   (and (eq_attr "athlon_decode" "double")
884132718Skan					(eq_attr "mode" "V2DF,V4SF,TI"))))
885132718Skan			 "athlon-double,athlon-fpsched,athlon-fstore,athlon-fstore")
886251212Spfg(define_insn_reservation "athlon_ssecvt_cvtps2pd_amdfam10" 2
887251212Spfg			 (and (eq_attr "cpu" "amdfam10")
888251212Spfg			      (and (eq_attr "type" "ssecvt")
889251212Spfg				   (and (eq_attr "amdfam10_decode" "direct")
890251212Spfg					(eq_attr "mode" "V2DF,V4SF,TI"))))
891251212Spfg			 "athlon-direct,athlon-fpsched,athlon-fstore")
892132718Skan;; cvtsi2sd mem,reg is directpath path  (cvtsi2sd reg,reg is doublepath)
893132718Skan;; cvtsi2sd has troughput 1 and is executed in store unit with latency of 6
894132718Skan(define_insn_reservation "athlon_sseicvt_cvtsi2sd_load" 6
895132718Skan			 (and (eq_attr "cpu" "athlon,k8")
896132718Skan			      (and (eq_attr "type" "sseicvt")
897132718Skan				   (and (eq_attr "athlon_decode" "direct")
898132718Skan					(and (eq_attr "mode" "SF,DF")
899132718Skan					     (eq_attr "memory" "load")))))
900132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fstore")
901251212Spfg(define_insn_reservation "athlon_sseicvt_cvtsi2sd_load_amdfam10" 9
902251212Spfg			 (and (eq_attr "cpu" "amdfam10")
903251212Spfg			      (and (eq_attr "type" "sseicvt")
904251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
905251212Spfg					(and (eq_attr "mode" "SF,DF")
906251212Spfg					     (eq_attr "memory" "load")))))
907251212Spfg			 "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
908132718Skan;; cvtsi2ss mem, reg is doublepath
909132718Skan(define_insn_reservation "athlon_sseicvt_cvtsi2ss_load" 9
910132718Skan			 (and (eq_attr "cpu" "athlon")
911132718Skan			      (and (eq_attr "type" "sseicvt")
912132718Skan				   (and (eq_attr "athlon_decode" "double")
913132718Skan					(and (eq_attr "mode" "SF,DF")
914132718Skan					     (eq_attr "memory" "load")))))
915132718Skan			 "athlon-vector,athlon-fpload,(athlon-fstore*2)")
916132718Skan(define_insn_reservation "athlon_sseicvt_cvtsi2ss_load_k8" 9
917169689Skan			 (and (eq_attr "cpu" "k8,generic64")
918132718Skan			      (and (eq_attr "type" "sseicvt")
919132718Skan				   (and (eq_attr "athlon_decode" "double")
920132718Skan					(and (eq_attr "mode" "SF,DF")
921132718Skan					     (eq_attr "memory" "load")))))
922132718Skan			 "athlon-double,athlon-fploadk8,(athlon-fstore*2)")
923251212Spfg(define_insn_reservation "athlon_sseicvt_cvtsi2ss_load_amdfam10" 9
924251212Spfg			 (and (eq_attr "cpu" "amdfam10")
925251212Spfg			      (and (eq_attr "type" "sseicvt")
926251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
927251212Spfg					(and (eq_attr "mode" "SF,DF")
928251212Spfg					     (eq_attr "memory" "load")))))
929251212Spfg			 "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")			 
930132718Skan;; cvtsi2sd reg,reg is double decoded (vector on Athlon)
931132718Skan(define_insn_reservation "athlon_sseicvt_cvtsi2sd_k8" 11
932169689Skan			 (and (eq_attr "cpu" "k8,athlon,generic64")
933132718Skan			      (and (eq_attr "type" "sseicvt")
934132718Skan				   (and (eq_attr "athlon_decode" "double")
935132718Skan					(and (eq_attr "mode" "SF,DF")
936132718Skan					     (eq_attr "memory" "none")))))
937132718Skan			 "athlon-double,athlon-fploadk8,athlon-fstore")
938251212Spfg(define_insn_reservation "athlon_sseicvt_cvtsi2sd_amdfam10" 14
939251212Spfg			 (and (eq_attr "cpu" "amdfam10")
940251212Spfg			      (and (eq_attr "type" "sseicvt")
941251212Spfg				   (and (eq_attr "amdfam10_decode" "vector")
942251212Spfg					(and (eq_attr "mode" "SF,DF")
943251212Spfg					     (eq_attr "memory" "none")))))
944251212Spfg			 "athlon-vector,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
945132718Skan;; cvtsi2ss reg, reg is doublepath
946132718Skan(define_insn_reservation "athlon_sseicvt_cvtsi2ss" 14
947169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
948132718Skan			      (and (eq_attr "type" "sseicvt")
949132718Skan				   (and (eq_attr "athlon_decode" "vector")
950132718Skan					(and (eq_attr "mode" "SF,DF")
951132718Skan					     (eq_attr "memory" "none")))))
952132718Skan			 "athlon-vector,athlon-fploadk8,(athlon-fvector*2)")
953251212Spfg(define_insn_reservation "athlon_sseicvt_cvtsi2ss_amdfam10" 14
954251212Spfg			 (and (eq_attr "cpu" "amdfam10")
955251212Spfg			      (and (eq_attr "type" "sseicvt")
956251212Spfg				   (and (eq_attr "amdfam10_decode" "vector")
957251212Spfg					(and (eq_attr "mode" "SF,DF")
958251212Spfg					     (eq_attr "memory" "none")))))
959251212Spfg			 "athlon-vector,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
960132718Skan;; cvtsd2ss mem,reg is doublepath, troughput unknown, latency 9
961132718Skan(define_insn_reservation "athlon_ssecvt_cvtsd2ss_load_k8" 9
962169689Skan			 (and (eq_attr "cpu" "k8,athlon,generic64")
963132718Skan			      (and (eq_attr "type" "ssecvt")
964132718Skan				   (and (eq_attr "athlon_decode" "double")
965132718Skan					(and (eq_attr "mode" "SF")
966132718Skan					     (eq_attr "memory" "load")))))
967132718Skan			 "athlon-double,athlon-fploadk8,(athlon-fstore*3)")
968251212Spfg(define_insn_reservation "athlon_ssecvt_cvtsd2ss_load_amdfam10" 9
969251212Spfg			 (and (eq_attr "cpu" "amdfam10")
970251212Spfg			      (and (eq_attr "type" "ssecvt")
971251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
972251212Spfg					(and (eq_attr "mode" "SF")
973251212Spfg					     (eq_attr "memory" "load")))))
974251212Spfg			 "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
975132718Skan;; cvtsd2ss reg,reg is vectorpath, troughput unknown, latency 12
976132718Skan(define_insn_reservation "athlon_ssecvt_cvtsd2ss" 12
977169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
978132718Skan			      (and (eq_attr "type" "ssecvt")
979132718Skan				   (and (eq_attr "athlon_decode" "vector")
980132718Skan					(and (eq_attr "mode" "SF")
981132718Skan					     (eq_attr "memory" "none")))))
982132718Skan			 "athlon-vector,athlon-fpsched,(athlon-fvector*3)")
983251212Spfg(define_insn_reservation "athlon_ssecvt_cvtsd2ss_amdfam10" 8
984251212Spfg			 (and (eq_attr "cpu" "amdfam10")
985251212Spfg			      (and (eq_attr "type" "ssecvt")
986251212Spfg				   (and (eq_attr "amdfam10_decode" "vector")
987251212Spfg					(and (eq_attr "mode" "SF")
988251212Spfg					     (eq_attr "memory" "none")))))
989251212Spfg			 "athlon-vector,athlon-fpsched,athlon-faddmul,(athlon-fstore*2)")
990132718Skan(define_insn_reservation "athlon_ssecvt_cvtpd2ps_load_k8" 8
991169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
992132718Skan			      (and (eq_attr "type" "ssecvt")
993132718Skan				   (and (eq_attr "athlon_decode" "vector")
994132718Skan					(and (eq_attr "mode" "V4SF,V2DF,TI")
995132718Skan					     (eq_attr "memory" "load")))))
996132718Skan			 "athlon-double,athlon-fpload2k8,(athlon-fstore*3)")
997251212Spfg(define_insn_reservation "athlon_ssecvt_cvtpd2ps_load_amdfam10" 9
998251212Spfg			 (and (eq_attr "cpu" "amdfam10")
999251212Spfg			      (and (eq_attr "type" "ssecvt")
1000251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
1001251212Spfg					(and (eq_attr "mode" "V4SF,V2DF,TI")
1002251212Spfg					     (eq_attr "memory" "load")))))
1003251212Spfg			 "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
1004132718Skan;; cvtpd2ps mem,reg is vectorpath, troughput unknown, latency 10
1005132718Skan;; ??? Why it is fater than cvtsd2ss?
1006132718Skan(define_insn_reservation "athlon_ssecvt_cvtpd2ps" 8
1007169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
1008132718Skan			      (and (eq_attr "type" "ssecvt")
1009132718Skan				   (and (eq_attr "athlon_decode" "vector")
1010132718Skan					(and (eq_attr "mode" "V4SF,V2DF,TI")
1011132718Skan					     (eq_attr "memory" "none")))))
1012132718Skan			 "athlon-vector,athlon-fpsched,athlon-fvector*2")
1013251212Spfg(define_insn_reservation "athlon_ssecvt_cvtpd2ps_amdfam10" 7
1014251212Spfg			 (and (eq_attr "cpu" "amdfam10")
1015251212Spfg			      (and (eq_attr "type" "ssecvt")
1016251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
1017251212Spfg					(and (eq_attr "mode" "V4SF,V2DF,TI")
1018251212Spfg					     (eq_attr "memory" "none")))))
1019251212Spfg			 "athlon-double,athlon-fpsched,(athlon-faddmul+athlon-fstore)")
1020132718Skan;; cvtsd2si mem,reg is doublepath, troughput 1, latency 9
1021132718Skan(define_insn_reservation "athlon_secvt_cvtsX2si_load" 9
1022169689Skan			 (and (eq_attr "cpu" "athlon,k8,generic64")
1023132718Skan			      (and (eq_attr "type" "sseicvt")
1024132718Skan				   (and (eq_attr "athlon_decode" "vector")
1025132718Skan					(and (eq_attr "mode" "SI,DI")
1026132718Skan					     (eq_attr "memory" "load")))))
1027132718Skan			 "athlon-vector,athlon-fploadk8,athlon-fvector")
1028251212Spfg(define_insn_reservation "athlon_secvt_cvtsX2si_load_amdfam10" 10
1029251212Spfg			 (and (eq_attr "cpu" "amdfam10")
1030251212Spfg			      (and (eq_attr "type" "sseicvt")
1031251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
1032251212Spfg					(and (eq_attr "mode" "SI,DI")
1033251212Spfg					     (eq_attr "memory" "load")))))
1034251212Spfg			 "athlon-double,athlon-fploadk8,(athlon-fadd+athlon-fstore)")
1035132718Skan;; cvtsd2si reg,reg is doublepath, troughput 1, latency 9
1036132718Skan(define_insn_reservation "athlon_ssecvt_cvtsX2si" 9
1037132718Skan			 (and (eq_attr "cpu" "athlon")
1038132718Skan			      (and (eq_attr "type" "sseicvt")
1039132718Skan				   (and (eq_attr "athlon_decode" "double")
1040132718Skan					(and (eq_attr "mode" "SI,DI")
1041132718Skan					     (eq_attr "memory" "none")))))
1042132718Skan			 "athlon-vector,athlon-fpsched,athlon-fvector")
1043132718Skan(define_insn_reservation "athlon_ssecvt_cvtsX2si_k8" 9
1044169689Skan			 (and (eq_attr "cpu" "k8,generic64")
1045132718Skan			      (and (eq_attr "type" "sseicvt")
1046132718Skan				   (and (eq_attr "athlon_decode" "double")
1047132718Skan					(and (eq_attr "mode" "SI,DI")
1048132718Skan					     (eq_attr "memory" "none")))))
1049132718Skan			 "athlon-double,athlon-fpsched,athlon-fstore")
1050251212Spfg(define_insn_reservation "athlon_ssecvt_cvtsX2si_amdfam10" 8
1051251212Spfg			 (and (eq_attr "cpu" "amdfam10")
1052251212Spfg			      (and (eq_attr "type" "sseicvt")
1053251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
1054251212Spfg					(and (eq_attr "mode" "SI,DI")
1055251212Spfg					     (eq_attr "memory" "none")))))
1056251212Spfg			 "athlon-double,athlon-fpsched,(athlon-fadd+athlon-fstore)")
1057251212Spfg;; cvtpd2dq reg,mem is doublepath, troughput 1, latency 9 on amdfam10
1058251212Spfg(define_insn_reservation "athlon_sseicvt_cvtpd2dq_load_amdfam10" 9
1059251212Spfg			 (and (eq_attr "cpu" "amdfam10")
1060251212Spfg			      (and (eq_attr "type" "sseicvt")
1061251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
1062251212Spfg					(and (eq_attr "mode" "TI")
1063251212Spfg					     (eq_attr "memory" "load")))))
1064251212Spfg			 "athlon-double,athlon-fploadk8,(athlon-faddmul+athlon-fstore)")
1065251212Spfg;; cvtpd2dq reg,mem is doublepath, troughput 1, latency 7 on amdfam10
1066251212Spfg(define_insn_reservation "athlon_sseicvt_cvtpd2dq_amdfam10" 7
1067251212Spfg			 (and (eq_attr "cpu" "amdfam10")
1068251212Spfg			      (and (eq_attr "type" "sseicvt")
1069251212Spfg				   (and (eq_attr "amdfam10_decode" "double")
1070251212Spfg					(and (eq_attr "mode" "TI")
1071251212Spfg					     (eq_attr "memory" "none")))))
1072251212Spfg			 "athlon-double,athlon-fpsched,(athlon-faddmul+athlon-fstore)")
1073117395Skan
1074132718Skan
1075132718Skan(define_insn_reservation "athlon_ssemul_load" 4
1076132718Skan			 (and (eq_attr "cpu" "athlon")
1077132718Skan			      (and (eq_attr "type" "ssemul")
1078132718Skan				   (and (eq_attr "mode" "SF,DF")
1079132718Skan					(eq_attr "memory" "load"))))
1080132718Skan			 "athlon-direct,athlon-fpload,athlon-fmul")
1081132718Skan(define_insn_reservation "athlon_ssemul_load_k8" 6
1082251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
1083132718Skan			      (and (eq_attr "type" "ssemul")
1084132718Skan				   (and (eq_attr "mode" "SF,DF")
1085132718Skan					(eq_attr "memory" "load"))))
1086132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fmul")
1087132718Skan(define_insn_reservation "athlon_ssemul" 4
1088251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
1089132718Skan			      (and (eq_attr "type" "ssemul")
1090132718Skan				   (eq_attr "mode" "SF,DF")))
1091132718Skan			 "athlon-direct,athlon-fpsched,athlon-fmul")
1092132718Skan(define_insn_reservation "athlon_ssemulvector_load" 5
1093132718Skan			 (and (eq_attr "cpu" "athlon")
1094132718Skan			      (and (eq_attr "type" "ssemul")
1095132718Skan				   (eq_attr "memory" "load")))
1096132718Skan			 "athlon-vector,athlon-fpload2,(athlon-fmul*2)")
1097132718Skan(define_insn_reservation "athlon_ssemulvector_load_k8" 7
1098169689Skan			 (and (eq_attr "cpu" "k8,generic64")
1099132718Skan			      (and (eq_attr "type" "ssemul")
1100132718Skan				   (eq_attr "memory" "load")))
1101132718Skan			 "athlon-double,athlon-fpload2k8,(athlon-fmul*2)")
1102251212Spfg(define_insn_reservation "athlon_ssemulvector_load_amdfam10" 6
1103251212Spfg			 (and (eq_attr "cpu" "amdfam10")
1104251212Spfg			      (and (eq_attr "type" "ssemul")
1105251212Spfg				   (eq_attr "memory" "load")))
1106251212Spfg			 "athlon-direct,athlon-fploadk8,athlon-fmul")
1107132718Skan(define_insn_reservation "athlon_ssemulvector" 5
1108132718Skan			 (and (eq_attr "cpu" "athlon")
1109132718Skan			      (eq_attr "type" "ssemul"))
1110132718Skan			 "athlon-vector,athlon-fpsched,(athlon-fmul*2)")
1111132718Skan(define_insn_reservation "athlon_ssemulvector_k8" 5
1112169689Skan			 (and (eq_attr "cpu" "k8,generic64")
1113132718Skan			      (eq_attr "type" "ssemul"))
1114132718Skan			 "athlon-double,athlon-fpsched,(athlon-fmul*2)")
1115251212Spfg(define_insn_reservation "athlon_ssemulvector_amdfam10" 4
1116251212Spfg			 (and (eq_attr "cpu" "amdfam10")
1117251212Spfg			      (eq_attr "type" "ssemul"))
1118251212Spfg			 "athlon-direct,athlon-fpsched,athlon-fmul")			 
1119132718Skan;; divsd timings.  divss is faster
1120132718Skan(define_insn_reservation "athlon_ssediv_load" 20
1121132718Skan			 (and (eq_attr "cpu" "athlon")
1122132718Skan			      (and (eq_attr "type" "ssediv")
1123132718Skan				   (and (eq_attr "mode" "SF,DF")
1124132718Skan					(eq_attr "memory" "load"))))
1125132718Skan			 "athlon-direct,athlon-fpload,athlon-fmul*17")
1126132718Skan(define_insn_reservation "athlon_ssediv_load_k8" 22
1127251212Spfg			 (and (eq_attr "cpu" "k8,generic64,amdfam10")
1128132718Skan			      (and (eq_attr "type" "ssediv")
1129132718Skan				   (and (eq_attr "mode" "SF,DF")
1130132718Skan					(eq_attr "memory" "load"))))
1131132718Skan			 "athlon-direct,athlon-fploadk8,athlon-fmul*17")
1132132718Skan(define_insn_reservation "athlon_ssediv" 20
1133251212Spfg			 (and (eq_attr "cpu" "athlon,k8,generic64,amdfam10")
1134132718Skan			      (and (eq_attr "type" "ssediv")
1135132718Skan				   (eq_attr "mode" "SF,DF")))
1136132718Skan			 "athlon-direct,athlon-fpsched,athlon-fmul*17")
1137132718Skan(define_insn_reservation "athlon_ssedivvector_load" 39
1138132718Skan			 (and (eq_attr "cpu" "athlon")
1139132718Skan			      (and (eq_attr "type" "ssediv")
1140132718Skan				   (eq_attr "memory" "load")))
1141132718Skan			 "athlon-vector,athlon-fpload2,athlon-fmul*34")
1142132718Skan(define_insn_reservation "athlon_ssedivvector_load_k8" 35
1143169689Skan			 (and (eq_attr "cpu" "k8,generic64")
1144132718Skan			      (and (eq_attr "type" "ssediv")
1145132718Skan				   (eq_attr "memory" "load")))
1146132718Skan			 "athlon-double,athlon-fpload2k8,athlon-fmul*34")
1147251212Spfg(define_insn_reservation "athlon_ssedivvector_load_amdfam10" 22
1148251212Spfg			 (and (eq_attr "cpu" "amdfam10")
1149251212Spfg			      (and (eq_attr "type" "ssediv")
1150251212Spfg				   (eq_attr "memory" "load")))
1151251212Spfg			 "athlon-direct,athlon-fploadk8,athlon-fmul*17")			 
1152132718Skan(define_insn_reservation "athlon_ssedivvector" 39
1153132718Skan			 (and (eq_attr "cpu" "athlon")
1154132718Skan			      (eq_attr "type" "ssediv"))
1155132718Skan			 "athlon-vector,athlon-fmul*34")
1156132718Skan(define_insn_reservation "athlon_ssedivvector_k8" 39
1157169689Skan			 (and (eq_attr "cpu" "k8,generic64")
1158132718Skan			      (eq_attr "type" "ssediv"))
1159132718Skan			 "athlon-double,athlon-fmul*34")
1160251212Spfg(define_insn_reservation "athlon_ssedivvector_amdfam10" 20
1161251212Spfg			 (and (eq_attr "cpu" "amdfam10")
1162251212Spfg			      (eq_attr "type" "ssediv"))
1163251212Spfg			 "athlon-direct,athlon-fmul*17")
1164251212Spfg(define_insn_reservation "athlon_sseins_amdfam10" 5
1165251212Spfg                         (and (eq_attr "cpu" "amdfam10")
1166251212Spfg                              (and (eq_attr "type" "sseins")
1167251212Spfg                                   (eq_attr "mode" "TI")))
1168251212Spfg                         "athlon-vector,athlon-fpsched,athlon-faddmul")
1169