xref: /netbsd-src/external/gpl3/gcc/dist/gcc/config/arm/aarch-cost-tables.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* RTX cost tables shared between arm and aarch64.
2 
3    Copyright (C) 2013-2022 Free Software Foundation, Inc.
4    Contributed by ARM Ltd.
5 
6    This file is part of GCC.
7 
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.
12 
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.
17 
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/>.  */
21 
22 #ifndef GCC_AARCH_COST_TABLES_H
23 #define GCC_AARCH_COST_TABLES_H
24 
25 const struct cpu_cost_table generic_extra_costs =
26 {
27   /* ALU */
28   {
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.  */
45   },
46   {
47     /* MULT SImode */
48     {
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.  */
55     },
56     /* MULT DImode */
57     {
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).  */
64     }
65   },
66   /* LD/ST */
67   {
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.  */
87   },
88   {
89     /* FP SFmode */
90     {
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.  */
104     },
105     /* FP DFmode */
106     {
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.  */
120     }
121   },
122   /* Vector */
123   {
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.  */
129   }
130 };
131 
132 const struct cpu_cost_table cortexa53_extra_costs =
133 {
134   /* ALU */
135   {
136     0,			/* arith.  */
137     0,			/* logical.  */
138     COSTS_N_INSNS (1),	/* shift.  */
139     0,			/* shift_reg.  */
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.  */
148     0,			/* clz.  */
149     0,			/* rev.  */
150     0,			/* non_exec.  */
151     true		/* non_exec_costs_exec.  */
152   },
153   {
154     /* MULT SImode */
155     {
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.  */
162     },
163     /* MULT DImode */
164     {
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.  */
171     }
172   },
173   /* LD/ST */
174   {
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.  */
184     0,				/* store.  */
185     0,				/* strd.  */
186     0,				/* stm_1st.  */
187     1,				/* stm_regs_per_insn_1st.  */
188     2,				/* stm_regs_per_insn_subsequent.  */
189     0,				/* storef.  */
190     0,				/* stored.  */
191     COSTS_N_INSNS (1),		/* store_unaligned.  */
192     COSTS_N_INSNS (1),		/* loadv.  */
193     COSTS_N_INSNS (1)		/* storev.  */
194   },
195   {
196     /* FP SFmode */
197     {
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.  */
203       0,			/* fpconst.  */
204       COSTS_N_INSNS (1),	/* neg.  */
205       0,			/* compare.  */
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.  */
211     },
212     /* FP DFmode */
213     {
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.  */
219       0,			/* fpconst.  */
220       COSTS_N_INSNS (1),	/* neg.  */
221       0,			/* compare.  */
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.  */
227     }
228   },
229   /* Vector */
230   {
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.  */
236   }
237 };
238 
239 const struct cpu_cost_table cortexa57_extra_costs =
240 {
241   /* ALU */
242   {
243     0,                 /* arith.  */
244     0,                 /* logical.  */
245     0,                 /* shift.  */
246     0,			/* shift_reg.  */
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.  */
251     0,                 /* extend.  */
252     COSTS_N_INSNS (1), /* extend_arith.  */
253     COSTS_N_INSNS (1), /* bfi.  */
254     0,                 /* bfx.  */
255     0,                 /* clz.  */
256     0,			/* rev.  */
257     0,                 /* non_exec.  */
258     true               /* non_exec_costs_exec.  */
259   },
260   {
261     /* MULT SImode */
262     {
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.  */
269     },
270     /* MULT DImode */
271     {
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.  */
278     }
279   },
280   /* LD/ST */
281   {
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.  */
291     0,                         /* store.  */
292     0,                         /* strd.  */
293     0,                         /* stm_1st.  */
294     1,                         /* stm_regs_per_insn_1st.  */
295     2,                         /* stm_regs_per_insn_subsequent.  */
296     0,                         /* storef.  */
297     0,                         /* stored.  */
298     COSTS_N_INSNS (1),         /* store_unaligned.  */
299     COSTS_N_INSNS (1),         /* loadv.  */
300     COSTS_N_INSNS (1)          /* storev.  */
301   },
302   {
303     /* FP SFmode */
304     {
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.  */
310       0,		       /* fpconst.  */
311       0,		       /* neg.  */
312       0,		       /* compare.  */
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.  */
318     },
319     /* FP DFmode */
320     {
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.  */
326       0,		       /* fpconst.  */
327       0,		       /* neg.  */
328       0,		       /* compare.  */
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.  */
334     }
335   },
336   /* Vector */
337   {
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.  */
343   }
344 };
345 
346 const struct cpu_cost_table cortexa76_extra_costs =
347 {
348   /* ALU */
349   {
350     0,                 /* arith.  */
351     0,                 /* logical.  */
352     0,                 /* shift.  */
353     0,                  /* shift_reg.  */
354     COSTS_N_INSNS (1), /* arith_shift.  */
355     COSTS_N_INSNS (1), /* arith_shift_reg.  */
356     0,		       /* log_shift.  */
357     COSTS_N_INSNS (1), /* log_shift_reg.  */
358     0,                 /* extend.  */
359     COSTS_N_INSNS (1), /* extend_arith.  */
360     COSTS_N_INSNS (1), /* bfi.  */
361     0,                 /* bfx.  */
362     0,                 /* clz.  */
363     0,                  /* rev.  */
364     0,                 /* non_exec.  */
365     true               /* non_exec_costs_exec.  */
366   },
367   {
368     /* MULT SImode */
369     {
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.  */
376     },
377     /* MULT DImode */
378     {
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.  */
385     }
386   },
387   /* LD/ST */
388   {
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.  */
398     0,                         /* store.  */
399     0,                         /* strd.  */
400     0,                         /* stm_1st.  */
401     1,                         /* stm_regs_per_insn_1st.  */
402     2,                         /* stm_regs_per_insn_subsequent.  */
403     0,                         /* storef.  */
404     0,                         /* stored.  */
405     COSTS_N_INSNS (1),         /* store_unaligned.  */
406     COSTS_N_INSNS (1),         /* loadv.  */
407     COSTS_N_INSNS (1)          /* storev.  */
408   },
409   {
410     /* FP SFmode */
411     {
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.  */
417       0,                       /* fpconst.  */
418       0,                       /* neg.  */
419       0,                       /* compare.  */
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.  */
425     },
426     /* FP DFmode */
427     {
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.  */
433       0,                       /* fpconst.  */
434       0,                       /* neg.  */
435       0,                       /* compare.  */
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.  */
441     }
442   },
443   /* Vector */
444   {
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.  */
450   }
451 };
452 
453 const struct cpu_cost_table exynosm1_extra_costs =
454 {
455   /* ALU */
456   {
457     0,                 /* arith.  */
458     0,                 /* logical.  */
459     0,                 /* shift.  */
460     COSTS_N_INSNS (0), /* shift_reg.  */
461     0,                 /* arith_shift.  */
462     COSTS_N_INSNS (1), /* arith_shift_reg.  */
463     0,                 /* log_shift.  */
464     COSTS_N_INSNS (1), /* log_shift_reg.  */
465     0,                 /* extend.  */
466     COSTS_N_INSNS (1), /* extend_arith.  */
467     0,                 /* bfi.  */
468     0,                 /* bfx.  */
469     0,                 /* clz.  */
470     0,                 /* rev.  */
471     0,                 /* non_exec.  */
472     true               /* non_exec_costs_exec.  */
473   },
474   {
475     /* MULT SImode */
476     {
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.  */
483     },
484     /* MULT DImode */
485     {
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.  */
492     }
493   },
494   /* LD/ST */
495   {
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.  */
505     0,                         /* store.  */
506     0,                         /* strd.  */
507     0,                         /* stm_1st.  */
508     1,                         /* stm_regs_per_insn_1st.  */
509     2,                         /* stm_regs_per_insn_subsequent.  */
510     0,                         /* storef.  */
511     0,                         /* stored.  */
512     0,                         /* store_unaligned.  */
513     COSTS_N_INSNS (1),         /* loadv.  */
514     COSTS_N_INSNS (1)          /* storev.  */
515   },
516   {
517     /* FP SFmode */
518     {
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.  */
532     },
533     /* FP DFmode */
534     {
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.  */
548     }
549   },
550   /* Vector */
551   {
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.  */
557   }
558 };
559 
560 const struct cpu_cost_table xgene1_extra_costs =
561 {
562   /* ALU */
563   {
564     0,                 /* arith.  */
565     0,                 /* logical.  */
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.  */
572     0,                 /* extend.  */
573     COSTS_N_INSNS (1), /* extend_arithm.  */
574     0,                 /* bfi.  */
575     0,                 /* bfx.  */
576     0,                 /* clz.  */
577     0,                 /* rev.  */
578     0,                 /* non_exec.  */
579     true               /* non_exec_costs_exec.  */
580   },
581   {
582     /* MULT SImode */
583     {
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.  */
590     },
591     /* MULT DImode */
592     {
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.  */
599     }
600   },
601   /* LD/ST */
602   {
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.  */
612     0,                         /* store.  */
613     0,                         /* strd.  */
614     0,                         /* stm_1st.  */
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.  */
622   },
623   {
624     /* FP SFmode */
625     {
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.  */
639     },
640     /* FP DFmode */
641     {
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.  */
655     }
656   },
657   /* Vector */
658   {
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.  */
664   }
665 };
666 
667 #endif /* GCC_AARCH_COST_TABLES_H */
668