comparison gcc/config/i386/slm.md @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
1 ;; Slivermont(SLM) Scheduling
2 ;; Copyright (C) 2009-2017 Free Software Foundation, Inc.
3 ;;
4 ;; This file is part of GCC.
5 ;;
6 ;; GCC is free software; you can redistribute it and/or modify
7 ;; it under the terms of the GNU General Public License as published by
8 ;; the Free Software Foundation; either version 3, or (at your option)
9 ;; any later version.
10 ;;
11 ;; GCC is distributed in the hope that it will be useful,
12 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;; GNU General Public License for more details.
15 ;;
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with GCC; see the file COPYING3. If not see
18 ;; <http://www.gnu.org/licenses/>.
19 ;;
20 ;; Silvermont has 2 out-of-order IEC, 2 in-order FEC and 1 in-order MEC.
21
22
23 (define_automaton "slm")
24
25 ;; EU: Execution Unit
26 ;; Silvermont EUs are connected by port 0 or port 1.
27
28 ;; SLM has two ports: port 0 and port 1 connecting to all execution units
29 (define_cpu_unit "slm-port-0,slm-port-1" "slm")
30
31 (define_cpu_unit "slm-ieu-0, slm-ieu-1,
32 slm-imul, slm-feu-0, slm-feu-1"
33 "slm")
34
35 (define_reservation "slm-all-ieu" "(slm-ieu-0 + slm-ieu-1 + slm-imul)")
36 (define_reservation "slm-all-feu" "(slm-feu-0 + slm-feu-1)")
37 (define_reservation "slm-all-eu" "(slm-all-ieu + slm-all-feu)")
38 (define_reservation "slm-fp-0" "(slm-port-0 + slm-feu-0)")
39
40 ;; Some EUs have duplicated copied and can be accessed via either
41 ;; port 0 or port 1
42 ;; (define_reservation "slm-port-either" "(slm-port-0 | slm-port-1)"
43 (define_reservation "slm-port-dual" "(slm-port-0 + slm-port-1)")
44
45 ;;; fmul insn can have 4 or 5 cycles latency
46 (define_reservation "slm-fmul-5c"
47 "(slm-port-0 + slm-feu-0), slm-feu-0, nothing*3")
48 (define_reservation "slm-fmul-4c" "(slm-port-0 + slm-feu-0), nothing*3")
49
50 ;;; fadd can has 3 cycles latency depends on instruction forms
51 (define_reservation "slm-fadd-3c" "(slm-port-1 + slm-feu-1), nothing*2")
52 (define_reservation "slm-fadd-4c"
53 "(slm-port-1 + slm-feu-1), slm-feu-1, nothing*2")
54
55 ;;; imul insn has 3 cycles latency for SI operands
56 (define_reservation "slm-imul-32"
57 "(slm-port-1 + slm-imul), nothing*2")
58 (define_reservation "slm-imul-mem-32"
59 "(slm-port-1 + slm-imul + slm-port-0), nothing*2")
60 ;;; imul has 4 cycles latency for DI operands with 1/2 tput
61 (define_reservation "slm-imul-64"
62 "(slm-port-1 + slm-imul), slm-imul, nothing*2")
63
64 ;;; dual-execution instructions can have 1,2,4,5 cycles latency depends on
65 ;;; instruction forms
66 (define_reservation "slm-dual-1c" "(slm-port-dual + slm-all-eu)")
67 (define_reservation "slm-dual-2c"
68 "(slm-port-dual + slm-all-eu, nothing)")
69
70 ;;; Most of simple ALU instructions have 1 cycle latency. Some of them
71 ;;; issue in port 0, some in port 0 and some in either port.
72 (define_reservation "slm-simple-0" "(slm-port-0 + slm-ieu-0)")
73 (define_reservation "slm-simple-1" "(slm-port-1 + slm-ieu-1)")
74 (define_reservation "slm-simple-either" "(slm-simple-0 | slm-simple-1)")
75
76 ;;; Complex macro-instruction has variants of latency, and uses both ports.
77 (define_reservation "slm-complex" "(slm-port-dual + slm-all-eu)")
78
79 (define_insn_reservation "slm_other" 9
80 (and (eq_attr "cpu" "slm")
81 (and (eq_attr "type" "other")
82 (eq_attr "atom_unit" "!jeu")))
83 "slm-complex, slm-all-eu*8")
84
85 ;; return has type "other" with atom_unit "jeu"
86 (define_insn_reservation "slm_other_2" 1
87 (and (eq_attr "cpu" "slm")
88 (and (eq_attr "type" "other")
89 (eq_attr "atom_unit" "jeu")))
90 "slm-dual-1c")
91
92 (define_insn_reservation "slm_multi" 9
93 (and (eq_attr "cpu" "slm")
94 (eq_attr "type" "multi"))
95 "slm-complex, slm-all-eu*8")
96
97 ;; Normal alu insns without carry
98 (define_insn_reservation "slm_alu" 1
99 (and (eq_attr "cpu" "slm")
100 (and (eq_attr "type" "alu")
101 (and (eq_attr "memory" "none")
102 (eq_attr "use_carry" "0"))))
103 "slm-simple-either")
104
105 ;; Normal alu insns without carry, but use MEC.
106 (define_insn_reservation "slm_alu_mem" 1
107 (and (eq_attr "cpu" "slm")
108 (and (eq_attr "type" "alu")
109 (and (eq_attr "memory" "!none")
110 (eq_attr "use_carry" "0"))))
111 "slm-simple-either")
112
113 ;; Alu insn consuming CF, such as add/sbb
114 (define_insn_reservation "slm_alu_carry" 2
115 (and (eq_attr "cpu" "slm")
116 (and (eq_attr "type" "alu")
117 (and (eq_attr "memory" "none")
118 (eq_attr "use_carry" "1"))))
119 "slm-simple-either, nothing")
120
121 ;; Alu insn consuming CF, such as add/sbb
122 (define_insn_reservation "slm_alu_carry_mem" 2
123 (and (eq_attr "cpu" "slm")
124 (and (eq_attr "type" "alu")
125 (and (eq_attr "memory" "!none")
126 (eq_attr "use_carry" "1"))))
127 "slm-simple-either, nothing")
128
129 (define_insn_reservation "slm_alu1" 1
130 (and (eq_attr "cpu" "slm")
131 (and (eq_attr "type" "alu1")
132 (eq_attr "memory" "none") (eq_attr "prefix_0f" "0")))
133 "slm-simple-either")
134
135 ;; bsf and bsf insn
136 (define_insn_reservation "slm_alu1_1" 10
137 (and (eq_attr "cpu" "slm")
138 (and (eq_attr "type" "alu1")
139 (eq_attr "memory" "none") (eq_attr "prefix_0f" "1")))
140 "slm-simple-1, slm-ieu-1*9")
141
142 (define_insn_reservation "slm_alu1_mem" 1
143 (and (eq_attr "cpu" "slm")
144 (and (eq_attr "type" "alu1")
145 (eq_attr "memory" "!none")))
146 "slm-simple-either")
147
148 (define_insn_reservation "slm_negnot" 1
149 (and (eq_attr "cpu" "slm")
150 (and (eq_attr "type" "negnot")
151 (eq_attr "memory" "none")))
152 "slm-simple-either")
153
154 (define_insn_reservation "slm_negnot_mem" 1
155 (and (eq_attr "cpu" "slm")
156 (and (eq_attr "type" "negnot")
157 (eq_attr "memory" "!none")))
158 "slm-simple-either")
159
160 (define_insn_reservation "slm_imov" 1
161 (and (eq_attr "cpu" "slm")
162 (and (eq_attr "type" "imov")
163 (eq_attr "memory" "none")))
164 "slm-simple-either")
165
166 (define_insn_reservation "slm_imov_mem" 1
167 (and (eq_attr "cpu" "slm")
168 (and (eq_attr "type" "imov")
169 (eq_attr "memory" "!none")))
170 "slm-simple-0")
171
172 ;; 16<-16, 32<-32
173 (define_insn_reservation "slm_imovx" 1
174 (and (eq_attr "cpu" "slm")
175 (and (eq_attr "type" "imovx")
176 (and (eq_attr "memory" "none")
177 (ior (and (match_operand:HI 0 "register_operand")
178 (match_operand:HI 1 "general_operand"))
179 (and (match_operand:SI 0 "register_operand")
180 (match_operand:SI 1 "general_operand"))))))
181 "slm-simple-either")
182
183 ;; 16<-16, 32<-32, mem
184 (define_insn_reservation "slm_imovx_mem" 1
185 (and (eq_attr "cpu" "slm")
186 (and (eq_attr "type" "imovx")
187 (and (eq_attr "memory" "!none")
188 (ior (and (match_operand:HI 0 "register_operand")
189 (match_operand:HI 1 "general_operand"))
190 (and (match_operand:SI 0 "register_operand")
191 (match_operand:SI 1 "general_operand"))))))
192 "slm-simple-either")
193
194 ;; 32<-16, 32<-8, 64<-16, 64<-8, 64<-32, 8<-8
195 (define_insn_reservation "slm_imovx_2" 1
196 (and (eq_attr "cpu" "slm")
197 (and (eq_attr "type" "imovx")
198 (and (eq_attr "memory" "none")
199 (ior (match_operand:QI 0 "register_operand")
200 (ior (and (match_operand:SI 0 "register_operand")
201 (not (match_operand:SI 1 "general_operand")))
202 (match_operand:DI 0 "register_operand"))))))
203 "slm-simple-either")
204
205 ;; 32<-16, 32<-8, 64<-16, 64<-8, 64<-32, 8<-8, mem
206 (define_insn_reservation "slm_imovx_2_mem" 1
207 (and (eq_attr "cpu" "slm")
208 (and (eq_attr "type" "imovx")
209 (and (eq_attr "memory" "!none")
210 (ior (match_operand:QI 0 "register_operand")
211 (ior (and (match_operand:SI 0 "register_operand")
212 (not (match_operand:SI 1 "general_operand")))
213 (match_operand:DI 0 "register_operand"))))))
214 "slm-simple-0")
215
216 ;; 16<-8
217 (define_insn_reservation "slm_imovx_3" 3
218 (and (eq_attr "cpu" "slm")
219 (and (eq_attr "type" "imovx")
220 (and (match_operand:HI 0 "register_operand")
221 (match_operand:QI 1 "general_operand"))))
222 "slm-simple-0, nothing*2")
223
224 (define_insn_reservation "slm_lea" 1
225 (and (eq_attr "cpu" "slm")
226 (and (eq_attr "type" "lea")
227 (eq_attr "mode" "!HI")))
228 "slm-simple-either")
229
230 ;; lea 16bit address is complex insn
231 (define_insn_reservation "slm_lea_2" 2
232 (and (eq_attr "cpu" "slm")
233 (and (eq_attr "type" "lea")
234 (eq_attr "mode" "HI")))
235 "slm-complex, slm-all-eu")
236
237 (define_insn_reservation "slm_incdec" 1
238 (and (eq_attr "cpu" "slm")
239 (and (eq_attr "type" "incdec")
240 (eq_attr "memory" "none")))
241 "slm-simple-0")
242
243 (define_insn_reservation "slm_incdec_mem" 3
244 (and (eq_attr "cpu" "slm")
245 (and (eq_attr "type" "incdec")
246 (eq_attr "memory" "!none")))
247 "slm-simple-0, nothing*2")
248
249 ;; simple shift instruction use SHIFT eu, none memory
250 (define_insn_reservation "slm_ishift" 1
251 (and (eq_attr "cpu" "slm")
252 (and (eq_attr "type" "ishift")
253 (and (eq_attr "memory" "none") (eq_attr "prefix_0f" "0"))))
254 "slm-simple-0")
255
256 ;; simple shift instruction use SHIFT eu, memory
257 (define_insn_reservation "slm_ishift_mem" 1
258 (and (eq_attr "cpu" "slm")
259 (and (eq_attr "type" "ishift")
260 (and (eq_attr "memory" "!none") (eq_attr "prefix_0f" "0"))))
261 "slm-simple-0")
262
263 ;; DF shift (prefixed with 0f) is complex insn with latency of 4 cycles
264 (define_insn_reservation "slm_ishift_3" 4
265 (and (eq_attr "cpu" "slm")
266 (and (eq_attr "type" "ishift")
267 (eq_attr "prefix_0f" "1")))
268 "slm-complex, slm-all-eu*3")
269
270 (define_insn_reservation "slm_ishift1" 1
271 (and (eq_attr "cpu" "slm")
272 (and (eq_attr "type" "ishift1")
273 (eq_attr "memory" "none")))
274 "slm-simple-0")
275
276 (define_insn_reservation "slm_ishift1_mem" 1
277 (and (eq_attr "cpu" "slm")
278 (and (eq_attr "type" "ishift1")
279 (eq_attr "memory" "!none")))
280 "slm-simple-0")
281
282 (define_insn_reservation "slm_rotate" 1
283 (and (eq_attr "cpu" "slm")
284 (and (eq_attr "type" "rotate")
285 (eq_attr "memory" "none")))
286 "slm-simple-0")
287
288 (define_insn_reservation "slm_rotate_mem" 1
289 (and (eq_attr "cpu" "slm")
290 (and (eq_attr "type" "rotate")
291 (eq_attr "memory" "!none")))
292 "slm-simple-0")
293
294 (define_insn_reservation "slm_rotate1" 1
295 (and (eq_attr "cpu" "slm")
296 (and (eq_attr "type" "rotate1")
297 (eq_attr "memory" "none")))
298 "slm-simple-0")
299
300 (define_insn_reservation "slm_rotate1_mem" 1
301 (and (eq_attr "cpu" "slm")
302 (and (eq_attr "type" "rotate1")
303 (eq_attr "memory" "!none")))
304 "slm-simple-0")
305
306 (define_insn_reservation "slm_imul" 3
307 (and (eq_attr "cpu" "slm")
308 (and (eq_attr "type" "imul")
309 (and (eq_attr "memory" "none") (eq_attr "mode" "SI"))))
310 "slm-imul-32")
311
312 (define_insn_reservation "slm_imul_mem" 3
313 (and (eq_attr "cpu" "slm")
314 (and (eq_attr "type" "imul")
315 (and (eq_attr "memory" "!none") (eq_attr "mode" "SI"))))
316 "slm-imul-mem-32")
317
318 ;; latency set to 4 as common 64x64 imul with 1/2 tput
319 (define_insn_reservation "slm_imul_3" 4
320 (and (eq_attr "cpu" "slm")
321 (and (eq_attr "type" "imul")
322 (eq_attr "mode" "!SI")))
323 "slm-imul-64")
324
325 (define_insn_reservation "slm_idiv" 33
326 (and (eq_attr "cpu" "slm")
327 (eq_attr "type" "idiv"))
328 "slm-complex, slm-all-eu*16, nothing*16")
329
330 (define_insn_reservation "slm_icmp" 1
331 (and (eq_attr "cpu" "slm")
332 (and (eq_attr "type" "icmp")
333 (eq_attr "memory" "none")))
334 "slm-simple-either")
335
336 (define_insn_reservation "slm_icmp_mem" 1
337 (and (eq_attr "cpu" "slm")
338 (and (eq_attr "type" "icmp")
339 (eq_attr "memory" "!none")))
340 "slm-simple-either")
341
342 (define_insn_reservation "slm_test" 1
343 (and (eq_attr "cpu" "slm")
344 (and (eq_attr "type" "test")
345 (eq_attr "memory" "none")))
346 "slm-simple-either")
347
348 (define_insn_reservation "slm_test_mem" 1
349 (and (eq_attr "cpu" "slm")
350 (and (eq_attr "type" "test")
351 (eq_attr "memory" "!none")))
352 "slm-simple-either")
353
354 (define_insn_reservation "slm_ibr" 1
355 (and (eq_attr "cpu" "slm")
356 (and (eq_attr "type" "ibr")
357 (eq_attr "memory" "!load")))
358 "slm-simple-1")
359
360 ;; complex if jump target is from address
361 (define_insn_reservation "slm_ibr_2" 2
362 (and (eq_attr "cpu" "slm")
363 (and (eq_attr "type" "ibr")
364 (eq_attr "memory" "load")))
365 "slm-complex, slm-all-eu")
366
367 (define_insn_reservation "slm_setcc" 1
368 (and (eq_attr "cpu" "slm")
369 (and (eq_attr "type" "setcc")
370 (eq_attr "memory" "!store")))
371 "slm-simple-either")
372
373 ;; 2 cycles complex if target is in memory
374 (define_insn_reservation "slm_setcc_2" 2
375 (and (eq_attr "cpu" "slm")
376 (and (eq_attr "type" "setcc")
377 (eq_attr "memory" "store")))
378 "slm-complex, slm-all-eu")
379
380 (define_insn_reservation "slm_icmov" 2
381 (and (eq_attr "cpu" "slm")
382 (and (eq_attr "type" "icmov")
383 (eq_attr "memory" "none")))
384 "slm-simple-either, nothing")
385
386 (define_insn_reservation "slm_icmov_mem" 2
387 (and (eq_attr "cpu" "slm")
388 (and (eq_attr "type" "icmov")
389 (eq_attr "memory" "!none")))
390 "slm-simple-0, nothing")
391
392 ;; UCODE if segreg, ignored
393 (define_insn_reservation "slm_push" 2
394 (and (eq_attr "cpu" "slm")
395 (eq_attr "type" "push"))
396 "slm-dual-2c")
397
398 ;; pop r64 is 1 cycle. UCODE if segreg, ignored
399 (define_insn_reservation "slm_pop" 1
400 (and (eq_attr "cpu" "slm")
401 (and (eq_attr "type" "pop")
402 (eq_attr "mode" "DI")))
403 "slm-dual-1c")
404
405 ;; pop non-r64 is 2 cycles. UCODE if segreg, ignored
406 (define_insn_reservation "slm_pop_2" 2
407 (and (eq_attr "cpu" "slm")
408 (and (eq_attr "type" "pop")
409 (eq_attr "mode" "!DI")))
410 "slm-dual-2c")
411
412 ;; UCODE if segreg, ignored
413 (define_insn_reservation "slm_call" 1
414 (and (eq_attr "cpu" "slm")
415 (eq_attr "type" "call"))
416 "slm-dual-1c")
417
418 (define_insn_reservation "slm_callv" 1
419 (and (eq_attr "cpu" "slm")
420 (eq_attr "type" "callv"))
421 "slm-dual-1c")
422
423 (define_insn_reservation "slm_leave" 3
424 (and (eq_attr "cpu" "slm")
425 (eq_attr "type" "leave"))
426 "slm-complex, slm-all-eu*2")
427
428 (define_insn_reservation "slm_str" 3
429 (and (eq_attr "cpu" "slm")
430 (eq_attr "type" "str"))
431 "slm-complex, slm-all-eu*2")
432
433 (define_insn_reservation "slm_sselog" 1
434 (and (eq_attr "cpu" "slm")
435 (and (eq_attr "type" "sselog")
436 (eq_attr "memory" "none")))
437 "slm-simple-either")
438
439 (define_insn_reservation "slm_sselog_mem" 1
440 (and (eq_attr "cpu" "slm")
441 (and (eq_attr "type" "sselog")
442 (eq_attr "memory" "!none")))
443 "slm-simple-either")
444
445 (define_insn_reservation "slm_sselog1" 1
446 (and (eq_attr "cpu" "slm")
447 (and (eq_attr "type" "sselog1")
448 (eq_attr "memory" "none")))
449 "slm-simple-0")
450
451 (define_insn_reservation "slm_sselog1_mem" 1
452 (and (eq_attr "cpu" "slm")
453 (and (eq_attr "type" "sselog1")
454 (eq_attr "memory" "!none")))
455 "slm-simple-0")
456
457 ;; not pmad, not psad
458 (define_insn_reservation "slm_sseiadd" 1
459 (and (eq_attr "cpu" "slm")
460 (and (eq_attr "type" "sseiadd")
461 (and (not (match_operand:V2DI 0 "register_operand"))
462 (and (eq_attr "atom_unit" "!simul")
463 (eq_attr "atom_unit" "!complex")))))
464 "slm-simple-either")
465
466 ;; pmad, psad and 64
467 (define_insn_reservation "slm_sseiadd_2" 4
468 (and (eq_attr "cpu" "slm")
469 (and (eq_attr "type" "sseiadd")
470 (and (not (match_operand:V2DI 0 "register_operand"))
471 (and (eq_attr "atom_unit" "simul" )
472 (eq_attr "mode" "DI")))))
473 "slm-fmul-4c")
474
475 ;; pmad, psad and 128
476 (define_insn_reservation "slm_sseiadd_3" 5
477 (and (eq_attr "cpu" "slm")
478 (and (eq_attr "type" "sseiadd")
479 (and (not (match_operand:V2DI 0 "register_operand"))
480 (and (eq_attr "atom_unit" "simul" )
481 (eq_attr "mode" "TI")))))
482 "slm-fmul-5c")
483
484 ;; if paddq(64 bit op), phadd/phsub
485 (define_insn_reservation "slm_sseiadd_4" 4
486 (and (eq_attr "cpu" "slm")
487 (and (eq_attr "type" "sseiadd")
488 (ior (match_operand:V2DI 0 "register_operand")
489 (eq_attr "atom_unit" "complex"))))
490 "slm-fadd-4c")
491
492 ;; if immediate op.
493 (define_insn_reservation "slm_sseishft" 1
494 (and (eq_attr "cpu" "slm")
495 (and (eq_attr "type" "sseishft")
496 (and (eq_attr "atom_unit" "!sishuf")
497 (match_operand 2 "immediate_operand"))))
498 "slm-simple-either")
499
500 ;; if palignr or psrldq
501 (define_insn_reservation "slm_sseishft_2" 1
502 (and (eq_attr "cpu" "slm")
503 (ior (eq_attr "type" "sseishft1")
504 (and (eq_attr "type" "sseishft")
505 (and (eq_attr "atom_unit" "sishuf")
506 (match_operand 2 "immediate_operand")))))
507 "slm-simple-0")
508
509 ;; if reg/mem op
510 (define_insn_reservation "slm_sseishft_3" 2
511 (and (eq_attr "cpu" "slm")
512 (and (eq_attr "type" "sseishft")
513 (not (match_operand 2 "immediate_operand"))))
514 "slm-complex, slm-all-eu")
515
516 (define_insn_reservation "slm_sseimul" 5
517 (and (eq_attr "cpu" "slm")
518 (eq_attr "type" "sseimul"))
519 "slm-fmul-5c")
520
521 ;; rcpss or rsqrtss
522 (define_insn_reservation "slm_sse" 4
523 (and (eq_attr "cpu" "slm")
524 (and (eq_attr "type" "sse")
525 (and (eq_attr "atom_sse_attr" "rcp") (eq_attr "mode" "SF"))))
526 "slm-fmul-4c")
527
528 ;; movshdup, movsldup. Suggest to type sseishft
529 (define_insn_reservation "slm_sse_2" 1
530 (and (eq_attr "cpu" "slm")
531 (and (eq_attr "type" "sse")
532 (eq_attr "atom_sse_attr" "movdup")))
533 "slm-simple-0")
534
535 ;; lfence
536 (define_insn_reservation "slm_sse_3" 1
537 (and (eq_attr "cpu" "slm")
538 (and (eq_attr "type" "sse")
539 (eq_attr "atom_sse_attr" "lfence")))
540 "slm-simple-either")
541
542 ;; sfence,clflush,mfence, prefetch
543 (define_insn_reservation "slm_sse_4" 1
544 (and (eq_attr "cpu" "slm")
545 (and (eq_attr "type" "sse")
546 (ior (eq_attr "atom_sse_attr" "fence")
547 (eq_attr "atom_sse_attr" "prefetch"))))
548 "slm-simple-0")
549
550 ;; rcpps, rsqrtss, sqrt, ldmxcsr
551 (define_insn_reservation "slm_sse_5" 9
552 (and (eq_attr "cpu" "slm")
553 (and (eq_attr "type" "sse")
554 (ior (ior (eq_attr "atom_sse_attr" "sqrt")
555 (eq_attr "atom_sse_attr" "mxcsr"))
556 (and (eq_attr "atom_sse_attr" "rcp")
557 (eq_attr "mode" "V4SF")))))
558 "slm-complex, slm-all-eu*7, nothing")
559
560 ;; xmm->xmm
561 (define_insn_reservation "slm_ssemov" 1
562 (and (eq_attr "cpu" "slm")
563 (and (eq_attr "type" "ssemov")
564 (and (match_operand 0 "register_operand" "xy")
565 (match_operand 1 "register_operand" "xy"))))
566 "slm-simple-either")
567
568 ;; reg->xmm
569 (define_insn_reservation "slm_ssemov_2" 1
570 (and (eq_attr "cpu" "slm")
571 (and (eq_attr "type" "ssemov")
572 (and (match_operand 0 "register_operand" "xy")
573 (match_operand 1 "register_operand" "r"))))
574 "slm-simple-0")
575
576 ;; xmm->reg
577 (define_insn_reservation "slm_ssemov_3" 3
578 (and (eq_attr "cpu" "slm")
579 (and (eq_attr "type" "ssemov")
580 (and (match_operand 0 "register_operand" "r")
581 (match_operand 1 "register_operand" "xy"))))
582 "slm-simple-0, nothing*2")
583
584 ;; mov mem
585 (define_insn_reservation "slm_ssemov_4" 1
586 (and (eq_attr "cpu" "slm")
587 (and (eq_attr "type" "ssemov")
588 (and (eq_attr "movu" "0") (eq_attr "memory" "!none"))))
589 "slm-simple-0")
590
591 ;; movu mem
592 (define_insn_reservation "slm_ssemov_5" 2
593 (and (eq_attr "cpu" "slm")
594 (and (eq_attr "type" "ssemov")
595 (ior (eq_attr "movu" "1") (eq_attr "memory" "!none"))))
596 "slm-simple-0, nothing")
597
598 ;; no memory simple
599 (define_insn_reservation "slm_sseadd" 3
600 (and (eq_attr "cpu" "slm")
601 (and (eq_attr "type" "sseadd")
602 (and (eq_attr "memory" "none")
603 (and (eq_attr "mode" "!V2DF")
604 (eq_attr "atom_unit" "!complex")))))
605 "slm-fadd-3c")
606
607 ;; memory simple
608 (define_insn_reservation "slm_sseadd_mem" 3
609 (and (eq_attr "cpu" "slm")
610 (and (eq_attr "type" "sseadd")
611 (and (eq_attr "memory" "!none")
612 (and (eq_attr "mode" "!V2DF")
613 (eq_attr "atom_unit" "!complex")))))
614 "slm-fadd-3c")
615
616 ;; maxps, minps, *pd, hadd, hsub
617 (define_insn_reservation "slm_sseadd_3" 4
618 (and (eq_attr "cpu" "slm")
619 (and (eq_attr "type" "sseadd")
620 (ior (eq_attr "mode" "V2DF") (eq_attr "atom_unit" "complex"))))
621 "slm-fadd-4c")
622
623 ;; Except dppd/dpps
624 (define_insn_reservation "slm_ssemul" 5
625 (and (eq_attr "cpu" "slm")
626 (and (eq_attr "type" "ssemul")
627 (eq_attr "mode" "!SF")))
628 "slm-fmul-5c")
629
630 ;; Except dppd/dpps, 4 cycle if mulss
631 (define_insn_reservation "slm_ssemul_2" 4
632 (and (eq_attr "cpu" "slm")
633 (and (eq_attr "type" "ssemul")
634 (eq_attr "mode" "SF")))
635 "slm-fmul-4c")
636
637 (define_insn_reservation "slm_ssecmp" 1
638 (and (eq_attr "cpu" "slm")
639 (eq_attr "type" "ssecmp"))
640 "slm-simple-either")
641
642 (define_insn_reservation "slm_ssecomi" 1
643 (and (eq_attr "cpu" "slm")
644 (eq_attr "type" "ssecomi"))
645 "slm-simple-0")
646
647 ;; no memory and cvtpi2ps, cvtps2pi, cvttps2pi
648 (define_insn_reservation "slm_ssecvt" 5
649 (and (eq_attr "cpu" "slm")
650 (and (eq_attr "type" "ssecvt")
651 (ior (and (match_operand:V2SI 0 "register_operand")
652 (match_operand:V4SF 1 "register_operand"))
653 (and (match_operand:V4SF 0 "register_operand")
654 (match_operand:V2SI 1 "register_operand")))))
655 "slm-fp-0, slm-feu-0, nothing*3")
656
657 ;; memory and cvtpi2ps, cvtps2pi, cvttps2pi
658 (define_insn_reservation "slm_ssecvt_mem" 5
659 (and (eq_attr "cpu" "slm")
660 (and (eq_attr "type" "ssecvt")
661 (ior (and (match_operand:V2SI 0 "register_operand")
662 (match_operand:V4SF 1 "memory_operand"))
663 (and (match_operand:V4SF 0 "register_operand")
664 (match_operand:V2SI 1 "memory_operand")))))
665 "slm-fp-0, slm-feu-0, nothing*3")
666
667 ;; cvtpd2pi, cvtpi2pd
668 (define_insn_reservation "slm_ssecvt_1" 2
669 (and (eq_attr "cpu" "slm")
670 (and (eq_attr "type" "ssecvt")
671 (ior (and (match_operand:V2DF 0 "register_operand")
672 (match_operand:V2SI 1 "register_operand"))
673 (and (match_operand:V2SI 0 "register_operand")
674 (match_operand:V2DF 1 "register_operand")))))
675 "slm-fp-0, slm-feu-0")
676
677 ;; memory and cvtpd2pi, cvtpi2pd
678 (define_insn_reservation "slm_ssecvt_1_mem" 2
679 (and (eq_attr "cpu" "slm")
680 (and (eq_attr "type" "ssecvt")
681 (ior (and (match_operand:V2DF 0 "register_operand")
682 (match_operand:V2SI 1 "memory_operand"))
683 (and (match_operand:V2SI 0 "register_operand")
684 (match_operand:V2DF 1 "memory_operand")))))
685 "slm-fp-0, slm-feu-0")
686
687 ;; otherwise. 4 cycles average for cvtss2sd
688 (define_insn_reservation "slm_ssecvt_3" 4
689 (and (eq_attr "cpu" "slm")
690 (and (eq_attr "type" "ssecvt")
691 (not (ior (and (match_operand:V2SI 0 "register_operand")
692 (match_operand:V4SF 1 "nonimmediate_operand"))
693 (and (match_operand:V4SF 0 "register_operand")
694 (match_operand:V2SI 1 "nonimmediate_operand"))))))
695 "slm-fp-0, nothing*3")
696
697 ;; memory and cvtsi2sd
698 (define_insn_reservation "slm_sseicvt" 1
699 (and (eq_attr "cpu" "slm")
700 (and (eq_attr "type" "sseicvt")
701 (and (match_operand:V2DF 0 "register_operand")
702 (match_operand:SI 1 "nonimmediate_operand"))))
703 "slm-fp-0")
704
705 ;; otherwise. 8 cycles average for cvtsd2si
706 (define_insn_reservation "slm_sseicvt_2" 4
707 (and (eq_attr "cpu" "slm")
708 (and (eq_attr "type" "sseicvt")
709 (not (and (match_operand:V2DF 0 "register_operand")
710 (match_operand:SI 1 "memory_operand")))))
711 "slm-fp-0, nothing*3")
712
713 (define_insn_reservation "slm_ssediv" 13
714 (and (eq_attr "cpu" "slm")
715 (eq_attr "type" "ssediv"))
716 "slm-fp-0, slm-feu-0*10, nothing*2")
717
718 ;; simple for fmov
719 (define_insn_reservation "slm_fmov" 1
720 (and (eq_attr "cpu" "slm")
721 (and (eq_attr "type" "fmov")
722 (eq_attr "memory" "none")))
723 "slm-simple-either")
724
725 ;; simple for fmov
726 (define_insn_reservation "slm_fmov_mem" 1
727 (and (eq_attr "cpu" "slm")
728 (and (eq_attr "type" "fmov")
729 (eq_attr "memory" "!none")))
730 "slm-simple-either")
731
732 ;; Define bypass here
733
734 ;; There will be 0 cycle stall from cmp/test to jcc
735
736 ;; There will be 1 cycle stall from flag producer to cmov and adc/sbb
737 (define_bypass 2 "slm_icmp, slm_test, slm_alu, slm_alu_carry,
738 slm_alu1, slm_negnot, slm_incdec, slm_ishift,
739 slm_ishift1, slm_rotate, slm_rotate1"
740 "slm_icmov, slm_alu_carry")
741
742 ;; lea to shift source stall is 1 cycle
743 (define_bypass 2 "slm_lea"
744 "slm_ishift, slm_ishift1, slm_rotate, slm_rotate1"
745 "!ix86_dep_by_shift_count")
746
747 ;; non-lea to shift count stall is 1 cycle
748 (define_bypass 2 "slm_alu_carry,
749 slm_alu,slm_alu1,slm_negnot,slm_imov,slm_imovx,
750 slm_incdec,slm_ishift,slm_ishift1,slm_rotate,
751 slm_rotate1, slm_setcc, slm_icmov, slm_pop,
752 slm_alu_mem, slm_alu_carry_mem, slm_alu1_mem,
753 slm_imovx_mem, slm_imovx_2_mem,
754 slm_imov_mem, slm_icmov_mem, slm_fmov_mem"
755 "slm_ishift, slm_ishift1, slm_rotate, slm_rotate1,
756 slm_ishift_mem, slm_ishift1_mem,
757 slm_rotate_mem, slm_rotate1_mem"
758 "ix86_dep_by_shift_count")