power10.md revision 1.1 1 1.1 mrg ;; Scheduling description for IBM POWER10 processor.
2 1.1 mrg ;; Copyright (C) 2016-2020 Free Software Foundation, Inc.
3 1.1 mrg ;;
4 1.1 mrg ;; This is a clone of power9.md. It is intended to be a placeholder until a
5 1.1 mrg ;; real scheduler model can be contributed.
6 1.1 mrg ;; The original power9.md was contributed by Pat Haugen (pthaugen (a] us.ibm.com).
7 1.1 mrg
8 1.1 mrg ;; This file is part of GCC.
9 1.1 mrg ;;
10 1.1 mrg ;; GCC is free software; you can redistribute it and/or modify it
11 1.1 mrg ;; under the terms of the GNU General Public License as published
12 1.1 mrg ;; by the Free Software Foundation; either version 3, or (at your
13 1.1 mrg ;; option) any later version.
14 1.1 mrg ;;
15 1.1 mrg ;; GCC is distributed in the hope that it will be useful, but WITHOUT
16 1.1 mrg ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 1.1 mrg ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
18 1.1 mrg ;; License for more details.
19 1.1 mrg ;;
20 1.1 mrg ;; You should have received a copy of the GNU General Public License
21 1.1 mrg ;; along with GCC; see the file COPYING3. If not see
22 1.1 mrg ;; <http://www.gnu.org/licenses/>.
23 1.1 mrg
24 1.1 mrg ;; This file was cloned from power9.md, it does not (yet) describe the actual
25 1.1 mrg ;; POWER10 processor.
26 1.1 mrg
27 1.1 mrg (define_automaton "power10dsp,power10lsu,power10vsu,power10fpdiv,power10misc")
28 1.1 mrg
29 1.1 mrg (define_cpu_unit "lsu0_power10,lsu1_power10,lsu2_power10,lsu3_power10" "power10lsu")
30 1.1 mrg (define_cpu_unit "vsu0_power10,vsu1_power10,vsu2_power10,vsu3_power10" "power10vsu")
31 1.1 mrg ; Two vector permute units, part of vsu
32 1.1 mrg (define_cpu_unit "prm0_power10,prm1_power10" "power10vsu")
33 1.1 mrg ; Two fixed point divide units, not pipelined
34 1.1 mrg (define_cpu_unit "fx_div0_power10,fx_div1_power10" "power10misc")
35 1.1 mrg (define_cpu_unit "bru_power10,cryptu_power10,dfu_power10" "power10misc")
36 1.1 mrg ; Create a false unit for use by non-pipelined FP div/sqrt
37 1.1 mrg (define_cpu_unit "fp_div0_power10,fp_div1_power10,fp_div2_power10,fp_div3_power10"
38 1.1 mrg "power10fpdiv")
39 1.1 mrg
40 1.1 mrg
41 1.1 mrg (define_cpu_unit "x0_power10,x1_power10,xa0_power10,xa1_power10,
42 1.1 mrg x2_power10,x3_power10,xb0_power10,xb1_power10,
43 1.1 mrg br0_power10,br1_power10" "power10dsp")
44 1.1 mrg
45 1.1 mrg
46 1.1 mrg ; Dispatch port reservations
47 1.1 mrg ;
48 1.1 mrg ; The processor can dispatch a maximum of 6 iops per cycle with the following
49 1.1 mrg ; general restrictions (other restrictions also apply):
50 1.1 mrg ; 1) At most 2 iops per execution slice
51 1.1 mrg ; 2) At most 2 iops to the branch unit
52 1.1 mrg ; Note that insn position in a dispatch group of 6 insns does not infer which
53 1.1 mrg ; execution slice the insn is routed to. The units are used to infer the
54 1.1 mrg ; conflicts that exist (i.e. an 'even' requirement will preclude dispatch
55 1.1 mrg ; with 2 insns with 'superslice' requirement).
56 1.1 mrg
57 1.1 mrg ; The xa0/xa1 units really represent the 3rd dispatch port for a superslice but
58 1.1 mrg ; are listed as separate units to allow those insns that preclude its use to
59 1.1 mrg ; still be scheduled two to a superslice while reserving the 3rd slot. The
60 1.1 mrg ; same applies for xb0/xb1.
61 1.1 mrg (define_reservation "DU_xa_power10" "xa0_power10+xa1_power10")
62 1.1 mrg (define_reservation "DU_xb_power10" "xb0_power10+xb1_power10")
63 1.1 mrg
64 1.1 mrg ; Any execution slice dispatch
65 1.1 mrg (define_reservation "DU_any_power10"
66 1.1 mrg "x0_power10|x1_power10|DU_xa_power10|x2_power10|x3_power10|
67 1.1 mrg DU_xb_power10")
68 1.1 mrg
69 1.1 mrg ; Even slice, actually takes even/odd slots
70 1.1 mrg (define_reservation "DU_even_power10" "x0_power10+x1_power10|x2_power10+x3_power10")
71 1.1 mrg
72 1.1 mrg ; Slice plus 3rd slot
73 1.1 mrg (define_reservation "DU_slice_3_power10"
74 1.1 mrg "x0_power10+xa0_power10|x1_power10+xa1_power10|
75 1.1 mrg x2_power10+xb0_power10|x3_power10+xb1_power10")
76 1.1 mrg
77 1.1 mrg ; Superslice
78 1.1 mrg (define_reservation "DU_super_power10"
79 1.1 mrg "x0_power10+x1_power10|x2_power10+x3_power10")
80 1.1 mrg
81 1.1 mrg ; 2-way cracked
82 1.1 mrg (define_reservation "DU_C2_power10" "x0_power10+x1_power10|
83 1.1 mrg x1_power10+DU_xa_power10|
84 1.1 mrg x1_power10+x2_power10|
85 1.1 mrg DU_xa_power10+x2_power10|
86 1.1 mrg x2_power10+x3_power10|
87 1.1 mrg x3_power10+DU_xb_power10")
88 1.1 mrg
89 1.1 mrg ; 2-way cracked plus 3rd slot
90 1.1 mrg (define_reservation "DU_C2_3_power10" "x0_power10+x1_power10+xa0_power10|
91 1.1 mrg x1_power10+x2_power10+xa1_power10|
92 1.1 mrg x2_power10+x3_power10+xb0_power10")
93 1.1 mrg
94 1.1 mrg ; 3-way cracked (consumes whole decode/dispatch cycle)
95 1.1 mrg (define_reservation "DU_C3_power10"
96 1.1 mrg "x0_power10+x1_power10+xa0_power10+xa1_power10+x2_power10+
97 1.1 mrg x3_power10+xb0_power10+xb1_power10+br0_power10+br1_power10")
98 1.1 mrg
99 1.1 mrg ; Branch ports
100 1.1 mrg (define_reservation "DU_branch_power10" "br0_power10|br1_power10")
101 1.1 mrg
102 1.1 mrg
103 1.1 mrg ; Execution unit reservations
104 1.1 mrg (define_reservation "LSU_power10"
105 1.1 mrg "lsu0_power10|lsu1_power10|lsu2_power10|lsu3_power10")
106 1.1 mrg
107 1.1 mrg (define_reservation "LSU_pair_power10"
108 1.1 mrg "lsu0_power10+lsu1_power10|lsu1_power10+lsu2_power10|
109 1.1 mrg lsu2_power10+lsu3_power10|lsu3_power10+lsu0_power10")
110 1.1 mrg
111 1.1 mrg (define_reservation "VSU_power10"
112 1.1 mrg "vsu0_power10|vsu1_power10|vsu2_power10|vsu3_power10")
113 1.1 mrg
114 1.1 mrg (define_reservation "VSU_super_power10"
115 1.1 mrg "vsu0_power10+vsu1_power10|vsu2_power10+vsu3_power10")
116 1.1 mrg
117 1.1 mrg (define_reservation "VSU_PRM_power10" "prm0_power10|prm1_power10")
118 1.1 mrg
119 1.1 mrg ; Define the reservation to be used by FP div/sqrt which allows other insns
120 1.1 mrg ; to be issued to the VSU, but blocks other div/sqrt for a number of cycles.
121 1.1 mrg ; Note that the number of cycles blocked varies depending on insn, but we
122 1.1 mrg ; just use the same number for all in order to keep the number of DFA states
123 1.1 mrg ; reasonable.
124 1.1 mrg (define_reservation "FP_DIV_power10"
125 1.1 mrg "fp_div0_power10*8|fp_div1_power10*8|fp_div2_power10*8|
126 1.1 mrg fp_div3_power10*8")
127 1.1 mrg (define_reservation "VEC_DIV_power10"
128 1.1 mrg "fp_div0_power10*8+fp_div1_power10*8|
129 1.1 mrg fp_div2_power10*8+fp_div3_power10*8")
130 1.1 mrg
131 1.1 mrg
132 1.1 mrg ; LS Unit
133 1.1 mrg (define_insn_reservation "power10-load" 4
134 1.1 mrg (and (eq_attr "type" "load")
135 1.1 mrg (eq_attr "sign_extend" "no")
136 1.1 mrg (eq_attr "update" "no")
137 1.1 mrg (eq_attr "cpu" "power10"))
138 1.1 mrg "DU_any_power10,LSU_power10")
139 1.1 mrg
140 1.1 mrg (define_insn_reservation "power10-load-update" 4
141 1.1 mrg (and (eq_attr "type" "load")
142 1.1 mrg (eq_attr "sign_extend" "no")
143 1.1 mrg (eq_attr "update" "yes")
144 1.1 mrg (eq_attr "cpu" "power10"))
145 1.1 mrg "DU_C2_power10,LSU_power10+VSU_power10")
146 1.1 mrg
147 1.1 mrg (define_insn_reservation "power10-load-ext" 6
148 1.1 mrg (and (eq_attr "type" "load")
149 1.1 mrg (eq_attr "sign_extend" "yes")
150 1.1 mrg (eq_attr "update" "no")
151 1.1 mrg (eq_attr "cpu" "power10"))
152 1.1 mrg "DU_C2_power10,LSU_power10")
153 1.1 mrg
154 1.1 mrg (define_insn_reservation "power10-load-ext-update" 6
155 1.1 mrg (and (eq_attr "type" "load")
156 1.1 mrg (eq_attr "sign_extend" "yes")
157 1.1 mrg (eq_attr "update" "yes")
158 1.1 mrg (eq_attr "cpu" "power10"))
159 1.1 mrg "DU_C3_power10,LSU_power10+VSU_power10")
160 1.1 mrg
161 1.1 mrg (define_insn_reservation "power10-fpload-double" 4
162 1.1 mrg (and (eq_attr "type" "fpload")
163 1.1 mrg (eq_attr "update" "no")
164 1.1 mrg (eq_attr "size" "64")
165 1.1 mrg (eq_attr "cpu" "power10"))
166 1.1 mrg "DU_slice_3_power10,LSU_power10")
167 1.1 mrg
168 1.1 mrg (define_insn_reservation "power10-fpload-update-double" 4
169 1.1 mrg (and (eq_attr "type" "fpload")
170 1.1 mrg (eq_attr "update" "yes")
171 1.1 mrg (eq_attr "size" "64")
172 1.1 mrg (eq_attr "cpu" "power10"))
173 1.1 mrg "DU_C2_3_power10,LSU_power10+VSU_power10")
174 1.1 mrg
175 1.1 mrg ; SFmode loads are cracked and have additional 2 cycles over DFmode
176 1.1 mrg (define_insn_reservation "power10-fpload-single" 6
177 1.1 mrg (and (eq_attr "type" "fpload")
178 1.1 mrg (eq_attr "update" "no")
179 1.1 mrg (eq_attr "size" "32")
180 1.1 mrg (eq_attr "cpu" "power10"))
181 1.1 mrg "DU_C2_3_power10,LSU_power10")
182 1.1 mrg
183 1.1 mrg (define_insn_reservation "power10-fpload-update-single" 6
184 1.1 mrg (and (eq_attr "type" "fpload")
185 1.1 mrg (eq_attr "update" "yes")
186 1.1 mrg (eq_attr "size" "32")
187 1.1 mrg (eq_attr "cpu" "power10"))
188 1.1 mrg "DU_C3_power10,LSU_power10+VSU_power10")
189 1.1 mrg
190 1.1 mrg (define_insn_reservation "power10-vecload" 5
191 1.1 mrg (and (eq_attr "type" "vecload")
192 1.1 mrg (eq_attr "cpu" "power10"))
193 1.1 mrg "DU_any_power10,LSU_pair_power10")
194 1.1 mrg
195 1.1 mrg ; Store data can issue 2 cycles after AGEN issue, 3 cycles for vector store
196 1.1 mrg (define_insn_reservation "power10-store" 0
197 1.1 mrg (and (eq_attr "type" "store")
198 1.1 mrg (eq_attr "update" "no")
199 1.1 mrg (eq_attr "indexed" "no")
200 1.1 mrg (eq_attr "cpu" "power10"))
201 1.1 mrg "DU_slice_3_power10,LSU_power10")
202 1.1 mrg
203 1.1 mrg (define_insn_reservation "power10-store-indexed" 0
204 1.1 mrg (and (eq_attr "type" "store")
205 1.1 mrg (eq_attr "update" "no")
206 1.1 mrg (eq_attr "indexed" "yes")
207 1.1 mrg (eq_attr "cpu" "power10"))
208 1.1 mrg "DU_slice_3_power10,LSU_power10")
209 1.1 mrg
210 1.1 mrg ; Update forms have 2 cycle latency for updated addr reg
211 1.1 mrg (define_insn_reservation "power10-store-update" 2
212 1.1 mrg (and (eq_attr "type" "store")
213 1.1 mrg (eq_attr "update" "yes")
214 1.1 mrg (eq_attr "indexed" "no")
215 1.1 mrg (eq_attr "cpu" "power10"))
216 1.1 mrg "DU_C2_3_power10,LSU_power10+VSU_power10")
217 1.1 mrg
218 1.1 mrg ; Update forms have 2 cycle latency for updated addr reg
219 1.1 mrg (define_insn_reservation "power10-store-update-indexed" 2
220 1.1 mrg (and (eq_attr "type" "store")
221 1.1 mrg (eq_attr "update" "yes")
222 1.1 mrg (eq_attr "indexed" "yes")
223 1.1 mrg (eq_attr "cpu" "power10"))
224 1.1 mrg "DU_C2_3_power10,LSU_power10+VSU_power10")
225 1.1 mrg
226 1.1 mrg (define_insn_reservation "power10-fpstore" 0
227 1.1 mrg (and (eq_attr "type" "fpstore")
228 1.1 mrg (eq_attr "update" "no")
229 1.1 mrg (eq_attr "cpu" "power10"))
230 1.1 mrg "DU_slice_3_power10,LSU_power10")
231 1.1 mrg
232 1.1 mrg ; Update forms have 2 cycle latency for updated addr reg
233 1.1 mrg (define_insn_reservation "power10-fpstore-update" 2
234 1.1 mrg (and (eq_attr "type" "fpstore")
235 1.1 mrg (eq_attr "update" "yes")
236 1.1 mrg (eq_attr "cpu" "power10"))
237 1.1 mrg "DU_C2_3_power10,LSU_power10+VSU_power10")
238 1.1 mrg
239 1.1 mrg (define_insn_reservation "power10-vecstore" 0
240 1.1 mrg (and (eq_attr "type" "vecstore")
241 1.1 mrg (eq_attr "cpu" "power10"))
242 1.1 mrg "DU_super_power10,LSU_pair_power10")
243 1.1 mrg
244 1.1 mrg (define_insn_reservation "power10-larx" 4
245 1.1 mrg (and (eq_attr "type" "load_l")
246 1.1 mrg (eq_attr "cpu" "power10"))
247 1.1 mrg "DU_any_power10,LSU_power10")
248 1.1 mrg
249 1.1 mrg (define_insn_reservation "power10-stcx" 2
250 1.1 mrg (and (eq_attr "type" "store_c")
251 1.1 mrg (eq_attr "cpu" "power10"))
252 1.1 mrg "DU_C2_3_power10,LSU_power10+VSU_power10")
253 1.1 mrg
254 1.1 mrg (define_insn_reservation "power10-sync" 4
255 1.1 mrg (and (eq_attr "type" "sync,isync")
256 1.1 mrg (eq_attr "cpu" "power10"))
257 1.1 mrg "DU_any_power10,LSU_power10")
258 1.1 mrg
259 1.1 mrg
260 1.1 mrg ; VSU Execution Unit
261 1.1 mrg
262 1.1 mrg ; Fixed point ops
263 1.1 mrg
264 1.1 mrg ; Most ALU insns are simple 2 cycle, including record form
265 1.1 mrg (define_insn_reservation "power10-alu" 2
266 1.1 mrg (and (eq_attr "type" "add,exts,integer,logical,isel")
267 1.1 mrg (eq_attr "cpu" "power10"))
268 1.1 mrg "DU_any_power10,VSU_power10")
269 1.1 mrg ; 5 cycle CR latency
270 1.1 mrg (define_bypass 5 "power10-alu"
271 1.1 mrg "power10-crlogical,power10-mfcr,power10-mfcrf")
272 1.1 mrg
273 1.1 mrg ; Rotate/shift prevent use of third slot
274 1.1 mrg (define_insn_reservation "power10-rot" 2
275 1.1 mrg (and (eq_attr "type" "insert,shift")
276 1.1 mrg (eq_attr "dot" "no")
277 1.1 mrg (eq_attr "cpu" "power10"))
278 1.1 mrg "DU_slice_3_power10,VSU_power10")
279 1.1 mrg
280 1.1 mrg ; Record form rotate/shift are cracked
281 1.1 mrg (define_insn_reservation "power10-cracked-alu" 2
282 1.1 mrg (and (eq_attr "type" "insert,shift")
283 1.1 mrg (eq_attr "dot" "yes")
284 1.1 mrg (eq_attr "cpu" "power10"))
285 1.1 mrg "DU_C2_3_power10,VSU_power10")
286 1.1 mrg ; 7 cycle CR latency
287 1.1 mrg (define_bypass 7 "power10-cracked-alu"
288 1.1 mrg "power10-crlogical,power10-mfcr,power10-mfcrf")
289 1.1 mrg
290 1.1 mrg (define_insn_reservation "power10-alu2" 3
291 1.1 mrg (and (eq_attr "type" "cntlz,popcnt,trap")
292 1.1 mrg (eq_attr "cpu" "power10"))
293 1.1 mrg "DU_any_power10,VSU_power10")
294 1.1 mrg ; 6 cycle CR latency
295 1.1 mrg (define_bypass 6 "power10-alu2"
296 1.1 mrg "power10-crlogical,power10-mfcr,power10-mfcrf")
297 1.1 mrg
298 1.1 mrg (define_insn_reservation "power10-cmp" 2
299 1.1 mrg (and (eq_attr "type" "cmp")
300 1.1 mrg (eq_attr "cpu" "power10"))
301 1.1 mrg "DU_any_power10,VSU_power10")
302 1.1 mrg
303 1.1 mrg
304 1.1 mrg ; Treat 'two' and 'three' types as 2 or 3 way cracked
305 1.1 mrg (define_insn_reservation "power10-two" 4
306 1.1 mrg (and (eq_attr "type" "two")
307 1.1 mrg (eq_attr "cpu" "power10"))
308 1.1 mrg "DU_C2_power10,VSU_power10")
309 1.1 mrg
310 1.1 mrg (define_insn_reservation "power10-three" 6
311 1.1 mrg (and (eq_attr "type" "three")
312 1.1 mrg (eq_attr "cpu" "power10"))
313 1.1 mrg "DU_C3_power10,VSU_power10")
314 1.1 mrg
315 1.1 mrg (define_insn_reservation "power10-mul" 5
316 1.1 mrg (and (eq_attr "type" "mul")
317 1.1 mrg (eq_attr "dot" "no")
318 1.1 mrg (eq_attr "cpu" "power10"))
319 1.1 mrg "DU_slice_3_power10,VSU_power10")
320 1.1 mrg
321 1.1 mrg (define_insn_reservation "power10-mul-compare" 5
322 1.1 mrg (and (eq_attr "type" "mul")
323 1.1 mrg (eq_attr "dot" "yes")
324 1.1 mrg (eq_attr "cpu" "power10"))
325 1.1 mrg "DU_C2_3_power10,VSU_power10")
326 1.1 mrg ; 10 cycle CR latency
327 1.1 mrg (define_bypass 10 "power10-mul-compare"
328 1.1 mrg "power10-crlogical,power10-mfcr,power10-mfcrf")
329 1.1 mrg
330 1.1 mrg ; Fixed point divides reserve the divide units for a minimum of 8 cycles
331 1.1 mrg (define_insn_reservation "power10-idiv" 16
332 1.1 mrg (and (eq_attr "type" "div")
333 1.1 mrg (eq_attr "size" "32")
334 1.1 mrg (eq_attr "cpu" "power10"))
335 1.1 mrg "DU_even_power10,fx_div0_power10*8|fx_div1_power10*8")
336 1.1 mrg
337 1.1 mrg (define_insn_reservation "power10-ldiv" 24
338 1.1 mrg (and (eq_attr "type" "div")
339 1.1 mrg (eq_attr "size" "64")
340 1.1 mrg (eq_attr "cpu" "power10"))
341 1.1 mrg "DU_even_power10,fx_div0_power10*8|fx_div1_power10*8")
342 1.1 mrg
343 1.1 mrg (define_insn_reservation "power10-crlogical" 2
344 1.1 mrg (and (eq_attr "type" "cr_logical")
345 1.1 mrg (eq_attr "cpu" "power10"))
346 1.1 mrg "DU_any_power10,VSU_power10")
347 1.1 mrg
348 1.1 mrg (define_insn_reservation "power10-mfcrf" 2
349 1.1 mrg (and (eq_attr "type" "mfcrf")
350 1.1 mrg (eq_attr "cpu" "power10"))
351 1.1 mrg "DU_any_power10,VSU_power10")
352 1.1 mrg
353 1.1 mrg (define_insn_reservation "power10-mfcr" 6
354 1.1 mrg (and (eq_attr "type" "mfcr")
355 1.1 mrg (eq_attr "cpu" "power10"))
356 1.1 mrg "DU_C3_power10,VSU_power10")
357 1.1 mrg
358 1.1 mrg ; Should differentiate between 1 cr field and > 1 since target of > 1 cr
359 1.1 mrg ; is cracked
360 1.1 mrg (define_insn_reservation "power10-mtcr" 2
361 1.1 mrg (and (eq_attr "type" "mtcr")
362 1.1 mrg (eq_attr "cpu" "power10"))
363 1.1 mrg "DU_any_power10,VSU_power10")
364 1.1 mrg
365 1.1 mrg ; Move to LR/CTR are executed in VSU
366 1.1 mrg (define_insn_reservation "power10-mtjmpr" 5
367 1.1 mrg (and (eq_attr "type" "mtjmpr")
368 1.1 mrg (eq_attr "cpu" "power10"))
369 1.1 mrg "DU_any_power10,VSU_power10")
370 1.1 mrg
371 1.1 mrg ; Floating point/Vector ops
372 1.1 mrg (define_insn_reservation "power10-fpsimple" 2
373 1.1 mrg (and (eq_attr "type" "fpsimple")
374 1.1 mrg (eq_attr "cpu" "power10"))
375 1.1 mrg "DU_slice_3_power10,VSU_power10")
376 1.1 mrg
377 1.1 mrg (define_insn_reservation "power10-fp" 5
378 1.1 mrg (and (eq_attr "type" "fp,dmul")
379 1.1 mrg (eq_attr "cpu" "power10"))
380 1.1 mrg "DU_slice_3_power10,VSU_power10")
381 1.1 mrg
382 1.1 mrg (define_insn_reservation "power10-fpcompare" 3
383 1.1 mrg (and (eq_attr "type" "fpcompare")
384 1.1 mrg (eq_attr "cpu" "power10"))
385 1.1 mrg "DU_slice_3_power10,VSU_power10")
386 1.1 mrg
387 1.1 mrg ; FP div/sqrt are executed in the VSU slices. They are not pipelined wrt other
388 1.1 mrg ; div/sqrt insns, but for the most part do not block pipelined ops.
389 1.1 mrg (define_insn_reservation "power10-sdiv" 22
390 1.1 mrg (and (eq_attr "type" "sdiv")
391 1.1 mrg (eq_attr "cpu" "power10"))
392 1.1 mrg "DU_slice_3_power10,VSU_power10,FP_DIV_power10")
393 1.1 mrg
394 1.1 mrg (define_insn_reservation "power10-ddiv" 27
395 1.1 mrg (and (eq_attr "type" "ddiv")
396 1.1 mrg (eq_attr "cpu" "power10"))
397 1.1 mrg "DU_slice_3_power10,VSU_power10,FP_DIV_power10")
398 1.1 mrg
399 1.1 mrg (define_insn_reservation "power10-sqrt" 26
400 1.1 mrg (and (eq_attr "type" "ssqrt")
401 1.1 mrg (eq_attr "cpu" "power10"))
402 1.1 mrg "DU_slice_3_power10,VSU_power10,FP_DIV_power10")
403 1.1 mrg
404 1.1 mrg (define_insn_reservation "power10-dsqrt" 36
405 1.1 mrg (and (eq_attr "type" "dsqrt")
406 1.1 mrg (eq_attr "cpu" "power10"))
407 1.1 mrg "DU_slice_3_power10,VSU_power10,FP_DIV_power10")
408 1.1 mrg
409 1.1 mrg (define_insn_reservation "power10-vec-2cyc" 2
410 1.1 mrg (and (eq_attr "type" "vecmove,veclogical,vecexts,veccmpfx")
411 1.1 mrg (eq_attr "cpu" "power10"))
412 1.1 mrg "DU_super_power10,VSU_super_power10")
413 1.1 mrg
414 1.1 mrg (define_insn_reservation "power10-veccmp" 3
415 1.1 mrg (and (eq_attr "type" "veccmp")
416 1.1 mrg (eq_attr "cpu" "power10"))
417 1.1 mrg "DU_super_power10,VSU_super_power10")
418 1.1 mrg
419 1.1 mrg (define_insn_reservation "power10-vecsimple" 3
420 1.1 mrg (and (eq_attr "type" "vecsimple")
421 1.1 mrg (eq_attr "cpu" "power10"))
422 1.1 mrg "DU_super_power10,VSU_super_power10")
423 1.1 mrg
424 1.1 mrg (define_insn_reservation "power10-vecnormal" 7
425 1.1 mrg (and (eq_attr "type" "vecfloat,vecdouble")
426 1.1 mrg (eq_attr "size" "!128")
427 1.1 mrg (eq_attr "cpu" "power10"))
428 1.1 mrg "DU_super_power10,VSU_super_power10")
429 1.1 mrg
430 1.1 mrg ; Quad-precision FP ops, execute in DFU
431 1.1 mrg (define_insn_reservation "power10-qp" 12
432 1.1 mrg (and (eq_attr "type" "vecfloat,vecdouble")
433 1.1 mrg (eq_attr "size" "128")
434 1.1 mrg (eq_attr "cpu" "power10"))
435 1.1 mrg "DU_super_power10,dfu_power10")
436 1.1 mrg
437 1.1 mrg (define_insn_reservation "power10-vecperm" 3
438 1.1 mrg (and (eq_attr "type" "vecperm")
439 1.1 mrg (eq_attr "cpu" "power10"))
440 1.1 mrg "DU_super_power10,VSU_PRM_power10")
441 1.1 mrg
442 1.1 mrg (define_insn_reservation "power10-veccomplex" 7
443 1.1 mrg (and (eq_attr "type" "veccomplex")
444 1.1 mrg (eq_attr "cpu" "power10"))
445 1.1 mrg "DU_super_power10,VSU_super_power10")
446 1.1 mrg
447 1.1 mrg (define_insn_reservation "power10-vecfdiv" 24
448 1.1 mrg (and (eq_attr "type" "vecfdiv")
449 1.1 mrg (eq_attr "cpu" "power10"))
450 1.1 mrg "DU_super_power10,VSU_super_power10,VEC_DIV_power10")
451 1.1 mrg
452 1.1 mrg (define_insn_reservation "power10-vecdiv" 27
453 1.1 mrg (and (eq_attr "type" "vecdiv")
454 1.1 mrg (eq_attr "size" "!128")
455 1.1 mrg (eq_attr "cpu" "power10"))
456 1.1 mrg "DU_super_power10,VSU_super_power10,VEC_DIV_power10")
457 1.1 mrg
458 1.1 mrg ; Use 8 for DFU reservation on QP div/mul to limit DFA state size
459 1.1 mrg (define_insn_reservation "power10-qpdiv" 56
460 1.1 mrg (and (eq_attr "type" "vecdiv")
461 1.1 mrg (eq_attr "size" "128")
462 1.1 mrg (eq_attr "cpu" "power10"))
463 1.1 mrg "DU_super_power10,dfu_power10*8")
464 1.1 mrg
465 1.1 mrg (define_insn_reservation "power10-qpmul" 24
466 1.1 mrg (and (eq_attr "type" "qmul")
467 1.1 mrg (eq_attr "size" "128")
468 1.1 mrg (eq_attr "cpu" "power10"))
469 1.1 mrg "DU_super_power10,dfu_power10*8")
470 1.1 mrg
471 1.1 mrg (define_insn_reservation "power10-mffgpr" 2
472 1.1 mrg (and (eq_attr "type" "mffgpr")
473 1.1 mrg (eq_attr "cpu" "power10"))
474 1.1 mrg "DU_slice_3_power10,VSU_power10")
475 1.1 mrg
476 1.1 mrg (define_insn_reservation "power10-mftgpr" 2
477 1.1 mrg (and (eq_attr "type" "mftgpr")
478 1.1 mrg (eq_attr "cpu" "power10"))
479 1.1 mrg "DU_slice_3_power10,VSU_power10")
480 1.1 mrg
481 1.1 mrg
482 1.1 mrg ; Branch Unit
483 1.1 mrg ; Move from LR/CTR are executed in BRU but consume a writeback port from an
484 1.1 mrg ; execution slice.
485 1.1 mrg (define_insn_reservation "power10-mfjmpr" 6
486 1.1 mrg (and (eq_attr "type" "mfjmpr")
487 1.1 mrg (eq_attr "cpu" "power10"))
488 1.1 mrg "DU_branch_power10,bru_power10+VSU_power10")
489 1.1 mrg
490 1.1 mrg ; Branch is 2 cycles
491 1.1 mrg (define_insn_reservation "power10-branch" 2
492 1.1 mrg (and (eq_attr "type" "jmpreg,branch")
493 1.1 mrg (eq_attr "cpu" "power10"))
494 1.1 mrg "DU_branch_power10,bru_power10")
495 1.1 mrg
496 1.1 mrg
497 1.1 mrg ; Crypto Unit
498 1.1 mrg (define_insn_reservation "power10-crypto" 6
499 1.1 mrg (and (eq_attr "type" "crypto")
500 1.1 mrg (eq_attr "cpu" "power10"))
501 1.1 mrg "DU_super_power10,cryptu_power10")
502 1.1 mrg
503 1.1 mrg
504 1.1 mrg ; HTM Unit
505 1.1 mrg (define_insn_reservation "power10-htm" 4
506 1.1 mrg (and (eq_attr "type" "htm")
507 1.1 mrg (eq_attr "cpu" "power10"))
508 1.1 mrg "DU_C2_power10,LSU_power10")
509 1.1 mrg
510 1.1 mrg (define_insn_reservation "power10-htm-simple" 2
511 1.1 mrg (and (eq_attr "type" "htmsimple")
512 1.1 mrg (eq_attr "cpu" "power10"))
513 1.1 mrg "DU_any_power10,VSU_power10")
514 1.1 mrg
515 1.1 mrg
516 1.1 mrg ; DFP Unit
517 1.1 mrg (define_insn_reservation "power10-dfp" 12
518 1.1 mrg (and (eq_attr "type" "dfp")
519 1.1 mrg (eq_attr "cpu" "power10"))
520 1.1 mrg "DU_even_power10,dfu_power10")
521 1.1 mrg
522