Add support for ARMv8-R architecture
[official-gcc.git] / gcc / config / arm / aarch-cost-tables.h
blobdc67faf9ab42b792ef9ce5c875c1bf41917814db
1 /* RTX cost tables shared between arm and aarch64.
3 Copyright (C) 2013-2017 Free Software Foundation, Inc.
4 Contributed by ARM Ltd.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published
10 by the Free Software Foundation; either version 3, or (at your
11 option) any later version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #ifndef GCC_AARCH_COST_TABLES_H
23 #define GCC_AARCH_COST_TABLES_H
25 const struct cpu_cost_table generic_extra_costs =
27 /* ALU */
29 0, /* arith. */
30 0, /* logical. */
31 0, /* shift. */
32 COSTS_N_INSNS (1), /* shift_reg. */
33 0, /* arith_shift. */
34 COSTS_N_INSNS (1), /* arith_shift_reg. */
35 0, /* log_shift. */
36 COSTS_N_INSNS (1), /* log_shift_reg. */
37 0, /* extend. */
38 COSTS_N_INSNS (1), /* extend_arith. */
39 0, /* bfi. */
40 0, /* bfx. */
41 0, /* clz. */
42 0, /* rev. */
43 COSTS_N_INSNS (1), /* non_exec. */
44 false /* non_exec_costs_exec. */
47 /* MULT SImode */
49 COSTS_N_INSNS (2), /* simple. */
50 COSTS_N_INSNS (1), /* flag_setting. */
51 COSTS_N_INSNS (2), /* extend. */
52 COSTS_N_INSNS (3), /* add. */
53 COSTS_N_INSNS (3), /* extend_add. */
54 COSTS_N_INSNS (8) /* idiv. */
56 /* MULT DImode */
58 0, /* simple (N/A). */
59 0, /* flag_setting (N/A). */
60 COSTS_N_INSNS (2), /* extend. */
61 0, /* add (N/A). */
62 COSTS_N_INSNS (3), /* extend_add. */
63 0 /* idiv (N/A). */
66 /* LD/ST */
68 COSTS_N_INSNS (2), /* load. */
69 COSTS_N_INSNS (2), /* load_sign_extend. */
70 COSTS_N_INSNS (3), /* ldrd. */
71 COSTS_N_INSNS (2), /* ldm_1st. */
72 1, /* ldm_regs_per_insn_1st. */
73 1, /* ldm_regs_per_insn_subsequent. */
74 COSTS_N_INSNS (2), /* loadf. */
75 COSTS_N_INSNS (3), /* loadd. */
76 COSTS_N_INSNS (1), /* load_unaligned. */
77 COSTS_N_INSNS (2), /* store. */
78 COSTS_N_INSNS (3), /* strd. */
79 COSTS_N_INSNS (2), /* stm_1st. */
80 1, /* stm_regs_per_insn_1st. */
81 1, /* stm_regs_per_insn_subsequent. */
82 COSTS_N_INSNS (2), /* storef. */
83 COSTS_N_INSNS (3), /* stored. */
84 COSTS_N_INSNS (1), /* store_unaligned. */
85 COSTS_N_INSNS (1), /* loadv. */
86 COSTS_N_INSNS (1) /* storev. */
89 /* FP SFmode */
91 COSTS_N_INSNS (7), /* div. */
92 COSTS_N_INSNS (2), /* mult. */
93 COSTS_N_INSNS (3), /* mult_addsub. */
94 COSTS_N_INSNS (3), /* fma. */
95 COSTS_N_INSNS (1), /* addsub. */
96 0, /* fpconst. */
97 0, /* neg. */
98 0, /* compare. */
99 0, /* widen. */
100 0, /* narrow. */
101 0, /* toint. */
102 0, /* fromint. */
103 0 /* roundint. */
105 /* FP DFmode */
107 COSTS_N_INSNS (15), /* div. */
108 COSTS_N_INSNS (5), /* mult. */
109 COSTS_N_INSNS (7), /* mult_addsub. */
110 COSTS_N_INSNS (7), /* fma. */
111 COSTS_N_INSNS (3), /* addsub. */
112 0, /* fpconst. */
113 0, /* neg. */
114 0, /* compare. */
115 0, /* widen. */
116 0, /* narrow. */
117 0, /* toint. */
118 0, /* fromint. */
119 0 /* roundint. */
122 /* Vector */
124 COSTS_N_INSNS (1) /* alu. */
128 const struct cpu_cost_table cortexa53_extra_costs =
130 /* ALU */
132 0, /* arith. */
133 0, /* logical. */
134 COSTS_N_INSNS (1), /* shift. */
135 0, /* shift_reg. */
136 COSTS_N_INSNS (1), /* arith_shift. */
137 COSTS_N_INSNS (1), /* arith_shift_reg. */
138 COSTS_N_INSNS (1), /* log_shift. */
139 COSTS_N_INSNS (1), /* log_shift_reg. */
140 COSTS_N_INSNS (1), /* extend. */
141 COSTS_N_INSNS (1), /* extend_arith. */
142 COSTS_N_INSNS (1), /* bfi. */
143 COSTS_N_INSNS (1), /* bfx. */
144 0, /* clz. */
145 0, /* rev. */
146 0, /* non_exec. */
147 true /* non_exec_costs_exec. */
150 /* MULT SImode */
152 COSTS_N_INSNS (1), /* simple. */
153 COSTS_N_INSNS (2), /* flag_setting. */
154 COSTS_N_INSNS (1), /* extend. */
155 COSTS_N_INSNS (1), /* add. */
156 COSTS_N_INSNS (1), /* extend_add. */
157 COSTS_N_INSNS (9) /* idiv. */
159 /* MULT DImode */
161 COSTS_N_INSNS (2), /* simple. */
162 0, /* flag_setting (N/A). */
163 COSTS_N_INSNS (2), /* extend. */
164 COSTS_N_INSNS (2), /* add. */
165 COSTS_N_INSNS (2), /* extend_add. */
166 COSTS_N_INSNS (15) /* idiv. */
169 /* LD/ST */
171 COSTS_N_INSNS (1), /* load. */
172 COSTS_N_INSNS (1), /* load_sign_extend. */
173 COSTS_N_INSNS (1), /* ldrd. */
174 COSTS_N_INSNS (1), /* ldm_1st. */
175 1, /* ldm_regs_per_insn_1st. */
176 2, /* ldm_regs_per_insn_subsequent. */
177 COSTS_N_INSNS (1), /* loadf. */
178 COSTS_N_INSNS (1), /* loadd. */
179 COSTS_N_INSNS (1), /* load_unaligned. */
180 0, /* store. */
181 0, /* strd. */
182 0, /* stm_1st. */
183 1, /* stm_regs_per_insn_1st. */
184 2, /* stm_regs_per_insn_subsequent. */
185 0, /* storef. */
186 0, /* stored. */
187 COSTS_N_INSNS (1), /* store_unaligned. */
188 COSTS_N_INSNS (1), /* loadv. */
189 COSTS_N_INSNS (1) /* storev. */
192 /* FP SFmode */
194 COSTS_N_INSNS (5), /* div. */
195 COSTS_N_INSNS (1), /* mult. */
196 COSTS_N_INSNS (2), /* mult_addsub. */
197 COSTS_N_INSNS (2), /* fma. */
198 COSTS_N_INSNS (1), /* addsub. */
199 0, /* fpconst. */
200 COSTS_N_INSNS (1), /* neg. */
201 0, /* compare. */
202 COSTS_N_INSNS (1), /* widen. */
203 COSTS_N_INSNS (1), /* narrow. */
204 COSTS_N_INSNS (1), /* toint. */
205 COSTS_N_INSNS (1), /* fromint. */
206 COSTS_N_INSNS (1) /* roundint. */
208 /* FP DFmode */
210 COSTS_N_INSNS (10), /* div. */
211 COSTS_N_INSNS (1), /* mult. */
212 COSTS_N_INSNS (2), /* mult_addsub. */
213 COSTS_N_INSNS (2), /* fma. */
214 COSTS_N_INSNS (1), /* addsub. */
215 0, /* fpconst. */
216 COSTS_N_INSNS (1), /* neg. */
217 0, /* compare. */
218 COSTS_N_INSNS (1), /* widen. */
219 COSTS_N_INSNS (1), /* narrow. */
220 COSTS_N_INSNS (1), /* toint. */
221 COSTS_N_INSNS (1), /* fromint. */
222 COSTS_N_INSNS (1) /* roundint. */
225 /* Vector */
227 COSTS_N_INSNS (1) /* alu. */
231 const struct cpu_cost_table cortexa57_extra_costs =
233 /* ALU */
235 0, /* arith. */
236 0, /* logical. */
237 0, /* shift. */
238 COSTS_N_INSNS (1), /* shift_reg. */
239 COSTS_N_INSNS (1), /* arith_shift. */
240 COSTS_N_INSNS (1), /* arith_shift_reg. */
241 COSTS_N_INSNS (1), /* log_shift. */
242 COSTS_N_INSNS (1), /* log_shift_reg. */
243 0, /* extend. */
244 COSTS_N_INSNS (1), /* extend_arith. */
245 COSTS_N_INSNS (1), /* bfi. */
246 0, /* bfx. */
247 0, /* clz. */
248 0, /* rev. */
249 0, /* non_exec. */
250 true /* non_exec_costs_exec. */
253 /* MULT SImode */
255 COSTS_N_INSNS (2), /* simple. */
256 COSTS_N_INSNS (3), /* flag_setting. */
257 COSTS_N_INSNS (2), /* extend. */
258 COSTS_N_INSNS (2), /* add. */
259 COSTS_N_INSNS (2), /* extend_add. */
260 COSTS_N_INSNS (18) /* idiv. */
262 /* MULT DImode */
264 COSTS_N_INSNS (4), /* simple. */
265 0, /* flag_setting (N/A). */
266 COSTS_N_INSNS (2), /* extend. */
267 COSTS_N_INSNS (4), /* add. */
268 COSTS_N_INSNS (2), /* extend_add. */
269 COSTS_N_INSNS (34) /* idiv. */
272 /* LD/ST */
274 COSTS_N_INSNS (3), /* load. */
275 COSTS_N_INSNS (3), /* load_sign_extend. */
276 COSTS_N_INSNS (3), /* ldrd. */
277 COSTS_N_INSNS (2), /* ldm_1st. */
278 1, /* ldm_regs_per_insn_1st. */
279 2, /* ldm_regs_per_insn_subsequent. */
280 COSTS_N_INSNS (4), /* loadf. */
281 COSTS_N_INSNS (4), /* loadd. */
282 COSTS_N_INSNS (5), /* load_unaligned. */
283 0, /* store. */
284 0, /* strd. */
285 0, /* stm_1st. */
286 1, /* stm_regs_per_insn_1st. */
287 2, /* stm_regs_per_insn_subsequent. */
288 0, /* storef. */
289 0, /* stored. */
290 COSTS_N_INSNS (1), /* store_unaligned. */
291 COSTS_N_INSNS (1), /* loadv. */
292 COSTS_N_INSNS (1) /* storev. */
295 /* FP SFmode */
297 COSTS_N_INSNS (6), /* div. */
298 COSTS_N_INSNS (1), /* mult. */
299 COSTS_N_INSNS (2), /* mult_addsub. */
300 COSTS_N_INSNS (2), /* fma. */
301 COSTS_N_INSNS (1), /* addsub. */
302 0, /* fpconst. */
303 0, /* neg. */
304 0, /* compare. */
305 COSTS_N_INSNS (1), /* widen. */
306 COSTS_N_INSNS (1), /* narrow. */
307 COSTS_N_INSNS (1), /* toint. */
308 COSTS_N_INSNS (1), /* fromint. */
309 COSTS_N_INSNS (1) /* roundint. */
311 /* FP DFmode */
313 COSTS_N_INSNS (11), /* div. */
314 COSTS_N_INSNS (1), /* mult. */
315 COSTS_N_INSNS (2), /* mult_addsub. */
316 COSTS_N_INSNS (2), /* fma. */
317 COSTS_N_INSNS (1), /* addsub. */
318 0, /* fpconst. */
319 0, /* neg. */
320 0, /* compare. */
321 COSTS_N_INSNS (1), /* widen. */
322 COSTS_N_INSNS (1), /* narrow. */
323 COSTS_N_INSNS (1), /* toint. */
324 COSTS_N_INSNS (1), /* fromint. */
325 COSTS_N_INSNS (1) /* roundint. */
328 /* Vector */
330 COSTS_N_INSNS (1) /* alu. */
334 const struct cpu_cost_table exynosm1_extra_costs =
336 /* ALU */
338 0, /* arith. */
339 0, /* logical. */
340 0, /* shift. */
341 COSTS_N_INSNS (0), /* shift_reg. */
342 0, /* arith_shift. */
343 COSTS_N_INSNS (1), /* arith_shift_reg. */
344 0, /* log_shift. */
345 COSTS_N_INSNS (1), /* log_shift_reg. */
346 0, /* extend. */
347 COSTS_N_INSNS (1), /* extend_arith. */
348 0, /* bfi. */
349 0, /* bfx. */
350 0, /* clz. */
351 0, /* rev. */
352 0, /* non_exec. */
353 true /* non_exec_costs_exec. */
356 /* MULT SImode */
358 COSTS_N_INSNS (2), /* simple. */
359 COSTS_N_INSNS (3), /* flag_setting. */
360 COSTS_N_INSNS (4), /* extend. */
361 COSTS_N_INSNS (2), /* add. */
362 COSTS_N_INSNS (4), /* extend_add. */
363 COSTS_N_INSNS (19) /* idiv. */
365 /* MULT DImode */
367 COSTS_N_INSNS (3), /* simple. */
368 0, /* flag_setting (N/A). */
369 COSTS_N_INSNS (4), /* extend. */
370 COSTS_N_INSNS (3), /* add. */
371 COSTS_N_INSNS (4), /* extend_add. */
372 COSTS_N_INSNS (35) /* idiv. */
375 /* LD/ST */
377 COSTS_N_INSNS (3), /* load. */
378 COSTS_N_INSNS (4), /* load_sign_extend. */
379 COSTS_N_INSNS (3), /* ldrd. */
380 COSTS_N_INSNS (2), /* ldm_1st. */
381 1, /* ldm_regs_per_insn_1st. */
382 2, /* ldm_regs_per_insn_subsequent. */
383 COSTS_N_INSNS (4), /* loadf. */
384 COSTS_N_INSNS (4), /* loadd. */
385 COSTS_N_INSNS (4), /* load_unaligned. */
386 0, /* store. */
387 0, /* strd. */
388 0, /* stm_1st. */
389 1, /* stm_regs_per_insn_1st. */
390 2, /* stm_regs_per_insn_subsequent. */
391 0, /* storef. */
392 0, /* stored. */
393 0, /* store_unaligned. */
394 COSTS_N_INSNS (1), /* loadv. */
395 COSTS_N_INSNS (1) /* storev. */
398 /* FP SFmode */
400 COSTS_N_INSNS (21), /* div. */
401 COSTS_N_INSNS (3), /* mult. */
402 COSTS_N_INSNS (4), /* mult_addsub. */
403 COSTS_N_INSNS (4), /* fma. */
404 COSTS_N_INSNS (2), /* addsub. */
405 COSTS_N_INSNS (0), /* fpconst. */
406 COSTS_N_INSNS (0), /* neg. */
407 COSTS_N_INSNS (3), /* compare. */
408 COSTS_N_INSNS (2), /* widen. */
409 COSTS_N_INSNS (2), /* narrow. */
410 COSTS_N_INSNS (12), /* toint. */
411 COSTS_N_INSNS (7), /* fromint. */
412 COSTS_N_INSNS (2) /* roundint. */
414 /* FP DFmode */
416 COSTS_N_INSNS (34), /* div. */
417 COSTS_N_INSNS (3), /* mult. */
418 COSTS_N_INSNS (4), /* mult_addsub. */
419 COSTS_N_INSNS (4), /* fma. */
420 COSTS_N_INSNS (2), /* addsub. */
421 COSTS_N_INSNS (0), /* fpconst. */
422 COSTS_N_INSNS (0), /* neg. */
423 COSTS_N_INSNS (3), /* compare. */
424 COSTS_N_INSNS (2), /* widen. */
425 COSTS_N_INSNS (2), /* narrow. */
426 COSTS_N_INSNS (12), /* toint. */
427 COSTS_N_INSNS (7), /* fromint. */
428 COSTS_N_INSNS (2) /* roundint. */
431 /* Vector */
433 COSTS_N_INSNS (0) /* alu. */
437 const struct cpu_cost_table xgene1_extra_costs =
439 /* ALU */
441 0, /* arith. */
442 0, /* logical. */
443 0, /* shift. */
444 COSTS_N_INSNS (1), /* shift_reg. */
445 COSTS_N_INSNS (1), /* arith_shift. */
446 COSTS_N_INSNS (1), /* arith_shift_reg. */
447 COSTS_N_INSNS (1), /* log_shift. */
448 COSTS_N_INSNS (1), /* log_shift_reg. */
449 COSTS_N_INSNS (1), /* extend. */
450 0, /* extend_arithm. */
451 COSTS_N_INSNS (1), /* bfi. */
452 COSTS_N_INSNS (1), /* bfx. */
453 0, /* clz. */
454 COSTS_N_INSNS (1), /* rev. */
455 0, /* non_exec. */
456 true /* non_exec_costs_exec. */
459 /* MULT SImode */
461 COSTS_N_INSNS (4), /* simple. */
462 COSTS_N_INSNS (4), /* flag_setting. */
463 COSTS_N_INSNS (4), /* extend. */
464 COSTS_N_INSNS (4), /* add. */
465 COSTS_N_INSNS (4), /* extend_add. */
466 COSTS_N_INSNS (20) /* idiv. */
468 /* MULT DImode */
470 COSTS_N_INSNS (5), /* simple. */
471 0, /* flag_setting (N/A). */
472 COSTS_N_INSNS (5), /* extend. */
473 COSTS_N_INSNS (5), /* add. */
474 COSTS_N_INSNS (5), /* extend_add. */
475 COSTS_N_INSNS (21) /* idiv. */
478 /* LD/ST */
480 COSTS_N_INSNS (5), /* load. */
481 COSTS_N_INSNS (6), /* load_sign_extend. */
482 COSTS_N_INSNS (5), /* ldrd. */
483 COSTS_N_INSNS (5), /* ldm_1st. */
484 1, /* ldm_regs_per_insn_1st. */
485 1, /* ldm_regs_per_insn_subsequent. */
486 COSTS_N_INSNS (10), /* loadf. */
487 COSTS_N_INSNS (10), /* loadd. */
488 COSTS_N_INSNS (5), /* load_unaligned. */
489 0, /* store. */
490 0, /* strd. */
491 0, /* stm_1st. */
492 1, /* stm_regs_per_insn_1st. */
493 1, /* stm_regs_per_insn_subsequent. */
494 0, /* storef. */
495 0, /* stored. */
496 0, /* store_unaligned. */
497 COSTS_N_INSNS (1), /* loadv. */
498 COSTS_N_INSNS (1) /* storev. */
501 /* FP SFmode */
503 COSTS_N_INSNS (23), /* div. */
504 COSTS_N_INSNS (5), /* mult. */
505 COSTS_N_INSNS (5), /* mult_addsub. */
506 COSTS_N_INSNS (5), /* fma. */
507 COSTS_N_INSNS (5), /* addsub. */
508 COSTS_N_INSNS (2), /* fpconst. */
509 COSTS_N_INSNS (3), /* neg. */
510 COSTS_N_INSNS (2), /* compare. */
511 COSTS_N_INSNS (6), /* widen. */
512 COSTS_N_INSNS (6), /* narrow. */
513 COSTS_N_INSNS (4), /* toint. */
514 COSTS_N_INSNS (4), /* fromint. */
515 COSTS_N_INSNS (4) /* roundint. */
517 /* FP DFmode */
519 COSTS_N_INSNS (29), /* div. */
520 COSTS_N_INSNS (5), /* mult. */
521 COSTS_N_INSNS (5), /* mult_addsub. */
522 COSTS_N_INSNS (5), /* fma. */
523 COSTS_N_INSNS (5), /* addsub. */
524 COSTS_N_INSNS (3), /* fpconst. */
525 COSTS_N_INSNS (3), /* neg. */
526 COSTS_N_INSNS (2), /* compare. */
527 COSTS_N_INSNS (6), /* widen. */
528 COSTS_N_INSNS (6), /* narrow. */
529 COSTS_N_INSNS (4), /* toint. */
530 COSTS_N_INSNS (4), /* fromint. */
531 COSTS_N_INSNS (4) /* roundint. */
534 /* Vector */
536 COSTS_N_INSNS (2) /* alu. */
540 #endif /* GCC_AARCH_COST_TABLES_H */