1 /* RTX cost tables shared between arm and aarch64.
3 Copyright (C) 2013-2023 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
=
32 COSTS_N_INSNS (1), /* shift_reg. */
34 COSTS_N_INSNS (1), /* arith_shift_reg. */
36 COSTS_N_INSNS (1), /* log_shift_reg. */
38 COSTS_N_INSNS (1), /* extend_arith. */
43 COSTS_N_INSNS (1), /* non_exec. */
44 false /* non_exec_costs_exec. */
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. */
58 0, /* simple (N/A). */
59 0, /* flag_setting (N/A). */
60 COSTS_N_INSNS (2), /* extend. */
62 COSTS_N_INSNS (3), /* extend_add. */
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. */
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. */
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. */
124 COSTS_N_INSNS (1), /* alu. */
125 COSTS_N_INSNS (4), /* mult. */
126 COSTS_N_INSNS (1), /* movi. */
127 COSTS_N_INSNS (2), /* dup. */
128 COSTS_N_INSNS (2) /* extract. */
132 const struct cpu_cost_table cortexa53_extra_costs
=
138 COSTS_N_INSNS (1), /* shift. */
140 COSTS_N_INSNS (1), /* arith_shift. */
141 COSTS_N_INSNS (1), /* arith_shift_reg. */
142 COSTS_N_INSNS (1), /* log_shift. */
143 COSTS_N_INSNS (1), /* log_shift_reg. */
144 COSTS_N_INSNS (1), /* extend. */
145 COSTS_N_INSNS (1), /* extend_arith. */
146 COSTS_N_INSNS (1), /* bfi. */
147 COSTS_N_INSNS (1), /* bfx. */
151 true /* non_exec_costs_exec. */
156 COSTS_N_INSNS (1), /* simple. */
157 COSTS_N_INSNS (2), /* flag_setting. */
158 COSTS_N_INSNS (1), /* extend. */
159 COSTS_N_INSNS (1), /* add. */
160 COSTS_N_INSNS (1), /* extend_add. */
161 COSTS_N_INSNS (9) /* idiv. */
165 COSTS_N_INSNS (2), /* simple. */
166 0, /* flag_setting (N/A). */
167 COSTS_N_INSNS (2), /* extend. */
168 COSTS_N_INSNS (2), /* add. */
169 COSTS_N_INSNS (2), /* extend_add. */
170 COSTS_N_INSNS (15) /* idiv. */
175 COSTS_N_INSNS (1), /* load. */
176 COSTS_N_INSNS (1), /* load_sign_extend. */
177 COSTS_N_INSNS (1), /* ldrd. */
178 COSTS_N_INSNS (1), /* ldm_1st. */
179 1, /* ldm_regs_per_insn_1st. */
180 2, /* ldm_regs_per_insn_subsequent. */
181 COSTS_N_INSNS (1), /* loadf. */
182 COSTS_N_INSNS (1), /* loadd. */
183 COSTS_N_INSNS (1), /* load_unaligned. */
187 1, /* stm_regs_per_insn_1st. */
188 2, /* stm_regs_per_insn_subsequent. */
191 COSTS_N_INSNS (1), /* store_unaligned. */
192 COSTS_N_INSNS (1), /* loadv. */
193 COSTS_N_INSNS (1) /* storev. */
198 COSTS_N_INSNS (5), /* div. */
199 COSTS_N_INSNS (1), /* mult. */
200 COSTS_N_INSNS (2), /* mult_addsub. */
201 COSTS_N_INSNS (2), /* fma. */
202 COSTS_N_INSNS (1), /* addsub. */
204 COSTS_N_INSNS (1), /* neg. */
206 COSTS_N_INSNS (1), /* widen. */
207 COSTS_N_INSNS (1), /* narrow. */
208 COSTS_N_INSNS (1), /* toint. */
209 COSTS_N_INSNS (1), /* fromint. */
210 COSTS_N_INSNS (1) /* roundint. */
214 COSTS_N_INSNS (10), /* div. */
215 COSTS_N_INSNS (1), /* mult. */
216 COSTS_N_INSNS (2), /* mult_addsub. */
217 COSTS_N_INSNS (2), /* fma. */
218 COSTS_N_INSNS (1), /* addsub. */
220 COSTS_N_INSNS (1), /* neg. */
222 COSTS_N_INSNS (1), /* widen. */
223 COSTS_N_INSNS (1), /* narrow. */
224 COSTS_N_INSNS (1), /* toint. */
225 COSTS_N_INSNS (1), /* fromint. */
226 COSTS_N_INSNS (1) /* roundint. */
231 COSTS_N_INSNS (1), /* alu. */
232 COSTS_N_INSNS (4), /* mult. */
233 COSTS_N_INSNS (1), /* movi. */
234 COSTS_N_INSNS (2), /* dup. */
235 COSTS_N_INSNS (2) /* extract. */
239 const struct cpu_cost_table cortexa57_extra_costs
=
247 COSTS_N_INSNS (1), /* arith_shift. */
248 COSTS_N_INSNS (1), /* arith_shift_reg. */
249 COSTS_N_INSNS (1), /* log_shift. */
250 COSTS_N_INSNS (1), /* log_shift_reg. */
252 COSTS_N_INSNS (1), /* extend_arith. */
253 COSTS_N_INSNS (1), /* bfi. */
258 true /* non_exec_costs_exec. */
263 COSTS_N_INSNS (2), /* simple. */
264 COSTS_N_INSNS (3), /* flag_setting. */
265 COSTS_N_INSNS (2), /* extend. */
266 COSTS_N_INSNS (2), /* add. */
267 COSTS_N_INSNS (2), /* extend_add. */
268 COSTS_N_INSNS (18) /* idiv. */
272 COSTS_N_INSNS (4), /* simple. */
273 0, /* flag_setting (N/A). */
274 COSTS_N_INSNS (2), /* extend. */
275 COSTS_N_INSNS (4), /* add. */
276 COSTS_N_INSNS (2), /* extend_add. */
277 COSTS_N_INSNS (34) /* idiv. */
282 COSTS_N_INSNS (3), /* load. */
283 COSTS_N_INSNS (3), /* load_sign_extend. */
284 COSTS_N_INSNS (3), /* ldrd. */
285 COSTS_N_INSNS (2), /* ldm_1st. */
286 1, /* ldm_regs_per_insn_1st. */
287 2, /* ldm_regs_per_insn_subsequent. */
288 COSTS_N_INSNS (4), /* loadf. */
289 COSTS_N_INSNS (4), /* loadd. */
290 COSTS_N_INSNS (5), /* load_unaligned. */
294 1, /* stm_regs_per_insn_1st. */
295 2, /* stm_regs_per_insn_subsequent. */
298 COSTS_N_INSNS (1), /* store_unaligned. */
299 COSTS_N_INSNS (1), /* loadv. */
300 COSTS_N_INSNS (1) /* storev. */
305 COSTS_N_INSNS (6), /* div. */
306 COSTS_N_INSNS (1), /* mult. */
307 COSTS_N_INSNS (2), /* mult_addsub. */
308 COSTS_N_INSNS (2), /* fma. */
309 COSTS_N_INSNS (1), /* addsub. */
313 COSTS_N_INSNS (1), /* widen. */
314 COSTS_N_INSNS (1), /* narrow. */
315 COSTS_N_INSNS (1), /* toint. */
316 COSTS_N_INSNS (1), /* fromint. */
317 COSTS_N_INSNS (1) /* roundint. */
321 COSTS_N_INSNS (11), /* div. */
322 COSTS_N_INSNS (1), /* mult. */
323 COSTS_N_INSNS (2), /* mult_addsub. */
324 COSTS_N_INSNS (2), /* fma. */
325 COSTS_N_INSNS (1), /* addsub. */
329 COSTS_N_INSNS (1), /* widen. */
330 COSTS_N_INSNS (1), /* narrow. */
331 COSTS_N_INSNS (1), /* toint. */
332 COSTS_N_INSNS (1), /* fromint. */
333 COSTS_N_INSNS (1) /* roundint. */
338 COSTS_N_INSNS (1), /* alu. */
339 COSTS_N_INSNS (4), /* mult. */
340 COSTS_N_INSNS (1), /* movi. */
341 COSTS_N_INSNS (2), /* dup. */
342 COSTS_N_INSNS (2) /* extract. */
346 const struct cpu_cost_table cortexa76_extra_costs
=
354 COSTS_N_INSNS (1), /* arith_shift. */
355 COSTS_N_INSNS (1), /* arith_shift_reg. */
357 COSTS_N_INSNS (1), /* log_shift_reg. */
359 COSTS_N_INSNS (1), /* extend_arith. */
360 COSTS_N_INSNS (1), /* bfi. */
365 true /* non_exec_costs_exec. */
370 COSTS_N_INSNS (1), /* simple. */
371 COSTS_N_INSNS (2), /* flag_setting. */
372 COSTS_N_INSNS (1), /* extend. */
373 COSTS_N_INSNS (1), /* add. */
374 COSTS_N_INSNS (1), /* extend_add. */
375 COSTS_N_INSNS (6) /* idiv. */
379 COSTS_N_INSNS (3), /* simple. */
380 0, /* flag_setting (N/A). */
381 COSTS_N_INSNS (1), /* extend. */
382 COSTS_N_INSNS (3), /* add. */
383 COSTS_N_INSNS (1), /* extend_add. */
384 COSTS_N_INSNS (10) /* idiv. */
389 COSTS_N_INSNS (3), /* load. */
390 COSTS_N_INSNS (3), /* load_sign_extend. */
391 COSTS_N_INSNS (3), /* ldrd. */
392 COSTS_N_INSNS (2), /* ldm_1st. */
393 1, /* ldm_regs_per_insn_1st. */
394 2, /* ldm_regs_per_insn_subsequent. */
395 COSTS_N_INSNS (4), /* loadf. */
396 COSTS_N_INSNS (4), /* loadd. */
397 COSTS_N_INSNS (5), /* load_unaligned. */
401 1, /* stm_regs_per_insn_1st. */
402 2, /* stm_regs_per_insn_subsequent. */
405 COSTS_N_INSNS (1), /* store_unaligned. */
406 COSTS_N_INSNS (1), /* loadv. */
407 COSTS_N_INSNS (1) /* storev. */
412 COSTS_N_INSNS (10), /* div. */
413 COSTS_N_INSNS (2), /* mult. */
414 COSTS_N_INSNS (3), /* mult_addsub. */
415 COSTS_N_INSNS (3), /* fma. */
416 COSTS_N_INSNS (1), /* addsub. */
420 COSTS_N_INSNS (1), /* widen. */
421 COSTS_N_INSNS (1), /* narrow. */
422 COSTS_N_INSNS (1), /* toint. */
423 COSTS_N_INSNS (1), /* fromint. */
424 COSTS_N_INSNS (1) /* roundint. */
428 COSTS_N_INSNS (15), /* div. */
429 COSTS_N_INSNS (2), /* mult. */
430 COSTS_N_INSNS (3), /* mult_addsub. */
431 COSTS_N_INSNS (3), /* fma. */
432 COSTS_N_INSNS (1), /* addsub. */
436 COSTS_N_INSNS (1), /* widen. */
437 COSTS_N_INSNS (1), /* narrow. */
438 COSTS_N_INSNS (1), /* toint. */
439 COSTS_N_INSNS (1), /* fromint. */
440 COSTS_N_INSNS (1) /* roundint. */
445 COSTS_N_INSNS (1), /* alu. */
446 COSTS_N_INSNS (4), /* mult. */
447 COSTS_N_INSNS (1), /* movi. */
448 COSTS_N_INSNS (2), /* dup. */
449 COSTS_N_INSNS (2) /* extract. */
453 const struct cpu_cost_table exynosm1_extra_costs
=
460 COSTS_N_INSNS (0), /* shift_reg. */
461 0, /* arith_shift. */
462 COSTS_N_INSNS (1), /* arith_shift_reg. */
464 COSTS_N_INSNS (1), /* log_shift_reg. */
466 COSTS_N_INSNS (1), /* extend_arith. */
472 true /* non_exec_costs_exec. */
477 COSTS_N_INSNS (2), /* simple. */
478 COSTS_N_INSNS (3), /* flag_setting. */
479 COSTS_N_INSNS (4), /* extend. */
480 COSTS_N_INSNS (2), /* add. */
481 COSTS_N_INSNS (4), /* extend_add. */
482 COSTS_N_INSNS (19) /* idiv. */
486 COSTS_N_INSNS (3), /* simple. */
487 0, /* flag_setting (N/A). */
488 COSTS_N_INSNS (4), /* extend. */
489 COSTS_N_INSNS (3), /* add. */
490 COSTS_N_INSNS (4), /* extend_add. */
491 COSTS_N_INSNS (35) /* idiv. */
496 COSTS_N_INSNS (3), /* load. */
497 COSTS_N_INSNS (4), /* load_sign_extend. */
498 COSTS_N_INSNS (3), /* ldrd. */
499 COSTS_N_INSNS (2), /* ldm_1st. */
500 1, /* ldm_regs_per_insn_1st. */
501 2, /* ldm_regs_per_insn_subsequent. */
502 COSTS_N_INSNS (4), /* loadf. */
503 COSTS_N_INSNS (4), /* loadd. */
504 COSTS_N_INSNS (4), /* load_unaligned. */
508 1, /* stm_regs_per_insn_1st. */
509 2, /* stm_regs_per_insn_subsequent. */
512 0, /* store_unaligned. */
513 COSTS_N_INSNS (1), /* loadv. */
514 COSTS_N_INSNS (1) /* storev. */
519 COSTS_N_INSNS (21), /* div. */
520 COSTS_N_INSNS (3), /* mult. */
521 COSTS_N_INSNS (4), /* mult_addsub. */
522 COSTS_N_INSNS (4), /* fma. */
523 COSTS_N_INSNS (2), /* addsub. */
524 COSTS_N_INSNS (0), /* fpconst. */
525 COSTS_N_INSNS (0), /* neg. */
526 COSTS_N_INSNS (3), /* compare. */
527 COSTS_N_INSNS (2), /* widen. */
528 COSTS_N_INSNS (2), /* narrow. */
529 COSTS_N_INSNS (12), /* toint. */
530 COSTS_N_INSNS (7), /* fromint. */
531 COSTS_N_INSNS (2) /* roundint. */
535 COSTS_N_INSNS (34), /* div. */
536 COSTS_N_INSNS (3), /* mult. */
537 COSTS_N_INSNS (4), /* mult_addsub. */
538 COSTS_N_INSNS (4), /* fma. */
539 COSTS_N_INSNS (2), /* addsub. */
540 COSTS_N_INSNS (0), /* fpconst. */
541 COSTS_N_INSNS (0), /* neg. */
542 COSTS_N_INSNS (3), /* compare. */
543 COSTS_N_INSNS (2), /* widen. */
544 COSTS_N_INSNS (2), /* narrow. */
545 COSTS_N_INSNS (12), /* toint. */
546 COSTS_N_INSNS (7), /* fromint. */
547 COSTS_N_INSNS (2) /* roundint. */
552 COSTS_N_INSNS (0), /* alu. */
553 COSTS_N_INSNS (4), /* mult. */
554 COSTS_N_INSNS (1), /* movi. */
555 COSTS_N_INSNS (2), /* dup. */
556 COSTS_N_INSNS (2) /* extract. */
560 const struct cpu_cost_table xgene1_extra_costs
=
566 COSTS_N_INSNS (1), /* shift. */
567 COSTS_N_INSNS (1), /* shift_reg. */
568 COSTS_N_INSNS (2), /* arith_shift. */
569 COSTS_N_INSNS (2), /* arith_shift_reg. */
570 COSTS_N_INSNS (2), /* log_shift. */
571 COSTS_N_INSNS (2), /* log_shift_reg. */
573 COSTS_N_INSNS (1), /* extend_arithm. */
579 true /* non_exec_costs_exec. */
584 COSTS_N_INSNS (3), /* simple. */
585 COSTS_N_INSNS (3), /* flag_setting. */
586 COSTS_N_INSNS (4), /* extend. */
587 COSTS_N_INSNS (4), /* add. */
588 COSTS_N_INSNS (4), /* extend_add. */
589 COSTS_N_INSNS (20) /* idiv. */
593 COSTS_N_INSNS (4), /* simple. */
594 COSTS_N_INSNS (4), /* flag_setting (N/A). */
595 COSTS_N_INSNS (5), /* extend. */
596 COSTS_N_INSNS (5), /* add. */
597 COSTS_N_INSNS (5), /* extend_add. */
598 COSTS_N_INSNS (21) /* idiv. */
603 COSTS_N_INSNS (4), /* load. */
604 COSTS_N_INSNS (5), /* load_sign_extend. */
605 COSTS_N_INSNS (4), /* ldrd. */
606 COSTS_N_INSNS (5), /* ldm_1st. */
607 1, /* ldm_regs_per_insn_1st. */
608 1, /* ldm_regs_per_insn_subsequent. */
609 COSTS_N_INSNS (9), /* loadf. */
610 COSTS_N_INSNS (9), /* loadd. */
611 0, /* load_unaligned. */
615 1, /* stm_regs_per_insn_1st. */
616 1, /* stm_regs_per_insn_subsequent. */
617 COSTS_N_INSNS (3), /* storef. */
618 COSTS_N_INSNS (3), /* stored. */
619 0, /* store_unaligned. */
620 COSTS_N_INSNS (9), /* loadv. */
621 COSTS_N_INSNS (3) /* storev. */
626 COSTS_N_INSNS (22), /* div. */
627 COSTS_N_INSNS (4), /* mult. */
628 COSTS_N_INSNS (4), /* mult_addsub. */
629 COSTS_N_INSNS (4), /* fma. */
630 COSTS_N_INSNS (4), /* addsub. */
631 COSTS_N_INSNS (1), /* fpconst. */
632 COSTS_N_INSNS (4), /* neg. */
633 COSTS_N_INSNS (9), /* compare. */
634 COSTS_N_INSNS (4), /* widen. */
635 COSTS_N_INSNS (4), /* narrow. */
636 COSTS_N_INSNS (4), /* toint. */
637 COSTS_N_INSNS (4), /* fromint. */
638 COSTS_N_INSNS (4) /* roundint. */
642 COSTS_N_INSNS (27), /* div. */
643 COSTS_N_INSNS (4), /* mult. */
644 COSTS_N_INSNS (4), /* mult_addsub. */
645 COSTS_N_INSNS (4), /* fma. */
646 COSTS_N_INSNS (4), /* addsub. */
647 COSTS_N_INSNS (1), /* fpconst. */
648 COSTS_N_INSNS (4), /* neg. */
649 COSTS_N_INSNS (9), /* compare. */
650 COSTS_N_INSNS (4), /* widen. */
651 COSTS_N_INSNS (4), /* narrow. */
652 COSTS_N_INSNS (4), /* toint. */
653 COSTS_N_INSNS (4), /* fromint. */
654 COSTS_N_INSNS (4) /* roundint. */
659 COSTS_N_INSNS (2), /* alu. */
660 COSTS_N_INSNS (8), /* mult. */
661 COSTS_N_INSNS (1), /* movi. */
662 COSTS_N_INSNS (2), /* dup. */
663 COSTS_N_INSNS (2) /* extract. */
667 #endif /* GCC_AARCH_COST_TABLES_H */