1 # Manipulate the CPU, FPU and architecture descriptions for ARM.
2 # Copyright (C) 2017 Free Software Foundation, Inc.
4 # This file is part of GCC.
6 # GCC is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3, or (at your option)
11 # GCC is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with GCC; see the file COPYING3. If not see
18 # <http://www.gnu.org/licenses/>.
20 # Invoke this with '-v cmd=<cmd>"
21 # where <cmd> is one of:
22 # data: Print the standard 'C' data tables for the CPUs
23 # common-data: Print the 'C' data for shared driver/compiler files
24 # headers: Print the standard 'C' headers for the CPUs
25 # md: Print the machine description fragment
26 # opt: Print the option tables fragment
27 # chkcpu <name>: Checks that <name> is a valid CPU
28 # chktune <name>: Checks that <name> is a valid CPU
29 # chkfpu <name>: Checks that <name> is a valid FPU
30 # chkarch <name>: Checks that <arch> is a valid architecture
33 print "error ("lineno
"): " m
> "/dev/stderr"
37 function toplevel
() {
38 if (cpu_name
!= "") fatal
("missing \"end cpu\"")
39 if (arch_name
!= "") fatal
("missing \"end arch\"")
40 if (fpu_name
!= "") fatal
("missing \"end fpu\"")
43 function boilerplate
(style
) {
49 } else if (style ==
"md") {
52 } else if (style ==
"sh") {
55 } else fatal
("Unknown comment style: "style
)
57 print cs
"-*- buffer-read-only: t -*-"
59 print cc
"Generated automatically by parsecpu.awk from arm-cpus.in."
60 print cc
"Do not edit."
62 print cc
"Copyright (C) 2011-2017 Free Software Foundation, Inc."
64 print cc
"This file is part of GCC."
66 print cc
"GCC is free software; you can redistribute it and/or modify"
67 print cc
"it under the terms of the GNU General Public License as"
68 print cc
"published by the Free Software Foundation; either version 3,"
69 print cc
"or (at your option) any later version."
71 print cc
"GCC is distributed in the hope that it will be useful,"
72 print cc
"but WITHOUT ANY WARRANTY; without even the implied warranty of"
73 print cc
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"
74 print cc
"GNU General Public License for more details."
76 print cc
"You should have received a copy of the GNU General Public"
77 print cc
"License along with GCC; see the file COPYING3. If not see"
78 print cc
"<http://www.gnu.org/licenses/>." ce
82 function tune_flag_pfx
(f
) {
86 function isa_pfx
(f
) {
87 if (f ~
/^
(bit
|quirk
)_.
*/) return "isa_" f
91 function gen_headers
() {
94 print "enum processor_type"
97 ncpus =
split (cpu_list
, cpus
)
99 for (n =
1; n
<= ncpus
; n
++) {
100 print " TARGET_CPU_"cpu_cnames
[cpus
[n
]]","
102 print " TARGET_CPU_arm_none"
105 print "enum arch_type"
108 narchs =
split (arch_list
, archs
)
110 for (n =
1; n
<= narchs
; n
++) {
111 print " TARGET_ARCH_"arch_cnames
[archs
[n
]]","
113 print " TARGET_ARCH_arm_none"
116 print "enum fpu_type"
119 nfpus =
split (fpu_list
, fpus
)
121 for (n =
1; n
<= nfpus
; n
++) {
122 print " TARGET_FPU_"fpu_cnames
[fpus
[n
]]","
124 print " TARGET_FPU_auto"
128 function gen_data
() {
131 print "static const cpu_tune all_tunes[] ="
134 ncpus =
split (cpu_list
, cpus
)
136 for (n =
1; n
<= ncpus
; n
++) {
137 print " { /* " cpus
[n
] ". */"
139 if (cpus
[n
] in cpu_tune_for
) {
140 if (!
(cpu_tune_for
[cpus
[n
]] in cpu_cnames
)) {
141 fatal
("unknown \"tune for\" target " cpu_tune_for
[cpus
[n
]] \
144 print " TARGET_CPU_" cpu_cnames
[cpu_tune_for
[cpus
[n
]]] ","
146 print " TARGET_CPU_" cpu_cnames
[cpus
[n
]] ","
149 if (cpus
[n
] in cpu_tune_flags
) {
150 print " (" cpu_tune_flags
[cpus
[n
]] "),"
153 print " &arm_" cpu_cost
[cpus
[n
]] "_tune"
156 print " {TARGET_CPU_arm_none, 0, NULL}"
161 function gen_comm_data
() {
164 ncpus =
split (cpu_list
, cpus
)
166 for (n =
1; n
<= ncpus
; n
++) {
167 if (cpus
[n
] in cpu_opts
) {
168 print "static const cpu_arch_extension cpu_opttab_" \
169 cpu_cnames
[cpus
[n
]] "[] = {"
170 nopts =
split (cpu_opts
[cpus
[n
]], opts
)
171 for (opt =
1; opt
<= nopts
; opt
++) {
173 print " \"" opts
[opt
] "\", " \
174 cpu_opt_remove
[cpus
[n
],opts
[opt
]] ", false,"
175 print " { " cpu_opt_isa
[cpus
[n
],opts
[opt
]] ", isa_nobit }"
178 if (cpus
[n
] in cpu_optaliases
) {
179 naliases =
split (cpu_optaliases
[cpus
[n
]], aliases
)
180 for (alias =
1; alias
<= naliases
; alias
++) {
182 cpu_opt_alias
[cpus
[n
],aliases
[alias
]]) in \
184 fatal
("Alias " aliases
[alias
] " target not defined " \
187 equiv=cpu_opt_alias
[cpus
[n
],aliases
[alias
]]
189 print " \"" aliases
[alias
] "\", " \
190 cpu_opt_remove
[cpus
[n
],equiv
] ", true, "
191 print " { " cpu_opt_isa
[cpus
[n
],equiv
] ", isa_nobit }"
195 print " { NULL, false, false, {isa_nobit}}"
200 print "const cpu_option all_cores[] ="
203 for (n =
1; n
<= ncpus
; n
++) {
207 print " \"" cpus
[n
] "\","
209 if (cpus
[n
] in cpu_opts
) {
210 print " cpu_opttab_" cpu_cnames
[cpus
[n
]] ","
211 } else print " NULL,"
213 nfeats =
split (cpu_arch
[cpus
[n
]], feats
, "+")
214 if (!
(feats
[1] in arch_isa
)) {
215 fatal
("unknown arch " feats
[1] " for cpu " cpus
[n
])
218 print " " arch_isa
[feats
[1]] ","
219 for (m =
2; m
<= nfeats
; m
++) {
220 if (!
((feats
[1], feats
[m
]) in arch_opt_isa
)) {
221 fatal
("unknown feature " feats
[m
] " for architecture " feats
[1])
223 if (arch_opt_remove
[feats
[1],feats
[m
]] ==
"true") {
224 fatal
("cannot remove features from architecture specs")
226 print " " arch_opt_isa
[feats
[1],feats
[m
]] ","
228 if (cpus
[n
] in cpu_fpu
) print " " fpu_isa
[cpu_fpu
[cpus
[n
]]] ","
229 if (cpus
[n
] in cpu_isa
) print " " cpu_isa
[cpus
[n
]] ","
234 print " TARGET_ARCH_" arch_cnames
[feats
[1]]
238 print " {{NULL, NULL, {isa_nobit}}, TARGET_ARCH_arm_none}"
241 narchs =
split (arch_list
, archs
)
243 for (n =
1; n
<= narchs
; n
++) {
244 if (archs
[n
] in arch_opts
) {
245 print "static const struct cpu_arch_extension arch_opttab_" \
246 arch_cnames
[archs
[n
]] "[] = {"
247 nopts =
split (arch_opts
[archs
[n
]], opts
)
248 for (opt =
1; opt
<= nopts
; opt
++) {
250 print " \"" opts
[opt
] "\", " \
251 arch_opt_remove
[archs
[n
],opts
[opt
]] ", false,"
252 print " { " arch_opt_isa
[archs
[n
],opts
[opt
]] ", isa_nobit }"
255 if (archs
[n
] in arch_optaliases
) {
256 naliases =
split (arch_optaliases
[archs
[n
]], aliases
)
257 for (alias =
1; alias
<= naliases
; alias
++) {
259 arch_opt_alias
[archs
[n
],aliases
[alias
]]) in \
261 fatal
("Alias " aliases
[alias
] " target not defined " \
262 "for architecture " archs
[n
])
264 equiv=arch_opt_alias
[archs
[n
],aliases
[alias
]]
266 print " \"" aliases
[alias
] "\", " \
267 arch_opt_remove
[archs
[n
],equiv
] ", true, "
268 print " { " arch_opt_isa
[archs
[n
],equiv
] ", isa_nobit }"
272 print " { NULL, false, false, {isa_nobit}}"
274 } else if (archs
[n
] in arch_optaliases
) {
275 fatal
("Architecture " archs
[n
] " has option aliases but no options")
279 print "const arch_option all_architectures[] ="
282 for (n =
1; n
<= narchs
; n
++) {
284 if (!
(arch_tune_for
[archs
[n
]] in cpu_cnames
)) {
285 fatal
("unknown \"tune for\" target " arch_tune_for
[archs
[n
]] \
286 " for architecture " archs
[n
])
289 print " \"" archs
[n
] "\","
291 if (archs
[n
] in arch_opts
) {
292 print " arch_opttab_" arch_cnames
[archs
[n
]] ","
293 } else print " NULL,"
296 print " " arch_isa
[archs
[n
]] ","
300 print " \"" arch_base
[archs
[n
]] "\", BASE_ARCH_" \
301 arch_base
[archs
[n
]] ","
302 # profile letter code, or zero if none.
303 if (archs
[n
] in arch_prof
) {
304 print " \'" arch_prof
[archs
[n
]] "\',"
309 print " TARGET_CPU_" cpu_cnames
[arch_tune_for
[archs
[n
]]] ","
313 print " {{NULL, NULL, {isa_nobit}},"
314 print " NULL, BASE_ARCH_0, 0, TARGET_CPU_arm_none}"
317 print "const arm_fpu_desc all_fpus[] ="
320 nfpus =
split (fpu_list
, fpus
)
322 for (n =
1; n
<= nfpus
; n
++) {
324 print " \"" fpus
[n
] "\","
326 print " " fpu_isa
[fpus
[n
]] ","
340 print "(define_attr \"tune\"\n\t\""
342 ncpus =
split (cpu_list
, cpus
)
344 for (n =
1; n
< ncpus
; n
++) {
348 print cpu_cnames
[cpus
[n
]]
351 print cpu_cnames
[cpus
[ncpus
]]"\""
352 print "\t(const (symbol_ref \"((enum attr_tune) arm_tune)\")))"
355 function gen_opt
() {
359 print "Name(processor_type) Type(enum processor_type)"
360 print "Known ARM CPUs (for use with the -mcpu= and -mtune= options):\n"
362 ncpus =
split (cpu_list
, cpus
)
364 for (n =
1; n
<= ncpus
; n
++) {
366 print "Enum(processor_type) String(" cpus
[n
] \
367 ") Value( TARGET_CPU_"cpu_cnames
[cpus
[n
]]")"
372 print "Name(arm_arch) Type(int)"
373 print "Known ARM architectures (for use with the -march= option):\n"
375 narchs =
split (arch_list
, archs
)
377 for (n =
1; n
<= narchs
; n
++) {
379 print "Enum(arm_arch) String(" archs
[n
] \
385 print "Name(arm_fpu) Type(enum fpu_type)"
386 print "Known ARM FPUs (for use with the -mfpu= option):\n"
388 nfpus =
split (fpu_list
, fpus
)
390 for (n =
1; n
<= nfpus
; n
++) {
392 print "Enum(arm_fpu) String(" fpus
[n
] \
393 ") Value(TARGET_FPU_"fpu_cnames
[fpus
[n
]]")"
398 print "Enum(arm_fpu) String(auto) Value(TARGET_FPU_auto)"
401 function check_cpu
(name
) {
402 exts =
split (name
, extensions
, "+")
404 if (! extensions
[1] in cpu_cnames
) {
408 for (n =
2; n
<= exts
; n
++) {
409 if (!
((extensions
[1], extensions
[n
]) in cpu_opt_remove
) \
410 && !
((extensions
[1], extensions
[n
]) in cpu_optaliases
)) {
417 function check_fpu
(name
) {
418 if (name in fpu_cnames
) {
419 print fpu_cnames
[name
]
423 function check_arch
(name
) {
424 exts =
split (name
, extensions
, "+")
426 if (! extensions
[1] in arch_isa
) {
430 for (n =
2; n
<= exts
; n
++) {
431 if (!
((extensions
[1], extensions
[n
]) in arch_opt_remove
) \
432 && !
((extensions
[1], extensions
[n
]) in arch_optaliases
)) {
444 if (cmd ==
"") fatal
("Usage parsecpu.awk -v cmd=<xyz>")
463 if (fpu_name
!= $
3) fatal
("mimatched end fpu")
464 if (!
(fpu_name in fpu_isa
)) {
465 fatal
("fpu definition \"" fpu_name
"\" lacks an \"isa\" statement")
467 fpu_cnames
[fpu_name
] = fpu_name
468 gsub(/[-+.
]/, "_", fpu_cnames
[fpu_name
])
469 fpu_list = fpu_list
" " fpu_name
481 if (arch_name ==
"") fatal
("\"base\" statement outside of arch block")
482 arch_base
[arch_name
] = $
2
487 if (arch_name ==
"") fatal
("\"profile\" statement outside of arch block")
488 arch_prof
[arch_name
] = $
2
493 if (arch_name
!= $
3) fatal
("mimatched end arch")
494 if (! arch_name in arch_tune_for
) {
495 fatal
("arch definition lacks a \"tune for\" statement")
497 if (! arch_name in arch_isa
) {
498 fatal
("arch definition lacks an \"isa\" statement")
500 arch_list = arch_list
" " arch_name
501 arch_cnames
[arch_name
] = arch_name
502 gsub(/[-+.
]/, "_", arch_cnames
[arch_name
])
514 if (cpu_name ==
"") fatal
("\"cname\" outside of cpu block")
515 cpu_cnames
[cpu_name
] = $
2
520 if (cpu_name
!= "") {
521 cpu_tune_for
[cpu_name
] = $
3
522 } else if (arch_name
!= "") {
523 arch_tune_for
[arch_name
] = $
3
524 } else fatal
("\"tune for\" outside of cpu or arch block")
531 for (n =
3; n
<= flag_count
; n
++) {
533 flags = tune_flag_pfx
($n
)
534 } else flags = flags
" | " tune_flag_pfx
($n
)
536 if (cpu_name
!= "") {
537 cpu_tune_flags
[cpu_name
] = flags
538 } else if (arch_name
!= "") {
539 arch_tune_flags
[arch_name
] = flags
540 } else fatal
("\"tune flags\" outside of cpu or arch block")
544 /^
[ ]*architecture
/ {
545 if (cpu_name ==
"") fatal
("\"architecture\" outside of cpu block")
546 cpu_arch
[cpu_name
] = $
2
551 if (cpu_name ==
"") fatal
("\"fpu\" outside of cpu block")
552 cpu_fpu
[cpu_name
] = $
2
559 for (n =
2; n
<= flag_count
; n
++) {
562 } else flags = flags
"," isa_pfx
($n
)
564 if (cpu_name
!= "") {
565 cpu_isa
[cpu_name
] = flags
566 } else if (arch_name
!= "") {
567 arch_isa
[arch_name
] = flags
568 } else if (fpu_name
!= "") {
569 fpu_isa
[fpu_name
] = flags
570 } else fatal
("\"isa\" outside of cpu, fpu or arch block")
578 } else if ($
3 ==
"remove") {
580 } else fatal
("syntax: option <name> add|remove isa-list")
583 for (n =
4; n
<= flag_count
; n
++) {
586 } else flags = flags
"," isa_pfx
($n
)
588 if (cpu_name
!= "") {
589 cpu_opts
[cpu_name
] = cpu_opts
[cpu_name
] " " name
590 cpu_opt_remove
[cpu_name
,name
] = remove
591 cpu_opt_isa
[cpu_name
,name
] = flags
592 } else if (arch_name
!= "") {
593 arch_opts
[arch_name
] = arch_opts
[arch_name
] " " name
594 arch_opt_remove
[arch_name
,name
] = remove
595 arch_opt_isa
[arch_name
,name
] = flags
596 } else fatal
("\"option\" outside of cpu or arch block")
603 if (cpu_name
!= "") {
604 cpu_optaliases
[cpu_name
] = cpu_optaliases
[cpu_name
] " " name
605 cpu_opt_alias
[cpu_name
,name
] = alias
606 } else if (arch_name
!= "") {
607 arch_optaliases
[arch_name
] = arch_optaliases
[arch_name
] " " name
608 arch_opt_alias
[arch_name
,name
] = alias
609 } else fatal
("\"optalias\" outside of cpu or arch block")
614 if (cpu_name ==
"") fatal
("\"costs\" outside of cpu block")
615 cpu_cost
[cpu_name
] = $
2
620 if (cpu_name
!= $
3) fatal
("mimatched end cpu")
621 if (!
(cpu_name in cpu_cnames
)) {
622 cpu_cnames
[cpu_name
] = cpu_name
623 gsub(/[-+.
]/, "_", cpu_cnames
[cpu_name
])
625 if (! cpu_name in cpu_arch
) fatal
("cpu definition lacks an architecture")
626 cpu_list = cpu_list
" " cpu_name
632 if (! parse_ok
) fatal
("Unrecognized statement: " $
0)
639 } else if (cmd ==
"common-data") {
641 } else if (cmd ==
"headers") {
643 } else if (cmd ==
"md") {
645 } else if (cmd ==
"opt") {
647 } else if (cmd ~
/^chk
(cpu
|tune
) /) {
649 print check_cpu
(target
[2])
650 } else if (cmd ~
/^chkarch
/) {
652 print check_arch
(target
[2])
653 } else if (cmd ~
/^chkfpu
/) {
656 } else fatal
("unrecognized command: "cmd
)