annotate gcc/config/i386/slm.md @ 158:494b0b89df80 default tip

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