1# Copyright (C) 2012-2021 Free Software Foundation, Inc.
2#
3# This file is part of GCC.
4#
5# GCC is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 3, or (at your option)
8# any later version.
9#
10# GCC is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GCC; see the file COPYING3.  If not see
17# <http://www.gnu.org/licenses/>.
18
19# This is a target makefile fragment that attempts to get
20# multilibs built for the range of CPU's, FPU's and ABI's that
21# are relevant for the A-profile architecture.  It should
22# not be used in conjunction with another make file fragment and
23# assumes --with-arch, --with-cpu, --with-fpu, --with-float, --with-mode
24# have their default values during the configure step.  We enforce
25# this during the top-level configury.
26
27# Arch and FPU variants to build libraries with
28
29MULTI_ARCH_OPTS_A       = march=armv7-a/march=armv7-a+fp/march=armv7-a+simd/march=armv7ve+simd/march=armv8-a/march=armv8-a+simd/march=armv9-a/march=armv9-a+simd
30MULTI_ARCH_DIRS_A       = v7-a v7-a+fp v7-a+simd v7ve+simd v8-a v8-a+simd v9-a v9-a+simd
31
32# ARMv7-A - build nofp, fp-d16 and SIMD variants
33
34MULTILIB_REQUIRED	+= mthumb/march=armv7-a/mfloat-abi=soft
35MULTILIB_REQUIRED	+= mthumb/march=armv7-a+fp/mfloat-abi=hard
36MULTILIB_REQUIRED	+= mthumb/march=armv7-a+fp/mfloat-abi=softfp
37MULTILIB_REQUIRED	+= mthumb/march=armv7-a+simd/mfloat-abi=hard
38MULTILIB_REQUIRED	+= mthumb/march=armv7-a+simd/mfloat-abi=softfp
39
40# ARMv7VE - only build a SIMD (+VFPv4) variant.
41MULTILIB_REQUIRED	+= mthumb/march=armv7ve+simd/mfloat-abi=hard
42MULTILIB_REQUIRED	+= mthumb/march=armv7ve+simd/mfloat-abi=softfp
43
44# ARMv8-A - build nofp and SIMD variants.
45MULTILIB_REQUIRED	+= mthumb/march=armv8-a/mfloat-abi=soft
46MULTILIB_REQUIRED	+= mthumb/march=armv8-a+simd/mfloat-abi=hard
47MULTILIB_REQUIRED	+= mthumb/march=armv8-a+simd/mfloat-abi=softfp
48
49# Armv9-A - build nofp and SIMD variants.
50MULTILIB_REQUIRED	+= mthumb/march=armv9-a/mfloat-abi=soft
51MULTILIB_REQUIRED	+= mthumb/march=armv9-a+simd/mfloat-abi=hard
52MULTILIB_REQUIRED	+= mthumb/march=armv9-a+simd/mfloat-abi=softfp
53
54# Matches
55
56# Arch Matches
57# Map all basic v7-a arch extensions to v7-a
58MULTILIB_MATCHES	+= $(foreach ARCH, $(v7_a_arch_variants), \
59			     march?armv7-a=march?armv7-a$(ARCH))
60
61# Map all v7-a FP variants to vfpv3-d16 (+fp)
62MULTILIB_MATCHES	+= $(foreach ARCH, $(filter-out +fp, $(v7_a_nosimd_variants)), \
63			     march?armv7-a+fp=march?armv7-a$(ARCH))
64
65MULTILIB_MATCHES	+= $(foreach ARCHVAR, $(v7_a_arch_variants), \
66			     $(foreach ARCH, $(v7_a_nosimd_variants), \
67			       march?armv7-a+fp=march?armv7-a$(ARCHVAR)$(ARCH)))
68
69# Map all v7-a SIMD variants to neon-vfpv3 (+simd)
70MULTILIB_MATCHES	+= $(foreach ARCH, $(filter-out +simd, $(v7_a_simd_variants)), \
71			     march?armv7-a+simd=march?armv7-a$(ARCH))
72
73MULTILIB_MATCHES	+= $(foreach ARCHVAR, $(v7_a_arch_variants), \
74			     $(foreach ARCH, $(v7_a_simd_variants), \
75			       march?armv7-a+simd=march?armv7-a$(ARCHVAR)$(ARCH)))
76
77# Neither FP nor SIMD: map v7ve to v7-a
78MULTILIB_MATCHES	+= march?armv7-a=march?armv7ve
79
80# ARMv7ve FP-only variants: map down to v7-a+fp
81MULTILIB_MATCHES	+= $(foreach ARCH, $(v7ve_nosimd_variants), \
82			     march?armv7-a+fp=march?armv7ve$(ARCH))
83
84# ARMv7ve with SIMD, but SIMD is less capable than the default - map down to v7-a+simd
85MULTILIB_MATCHES	+= $(foreach ARCH, $(v7ve_vfpv3_simd_variants), \
86			     march?armv7-a+simd=march?armv7ve$(ARCH))
87
88# ARMv8 without SIMD: map down to base architecture
89MULTILIB_MATCHES	+= $(foreach ARCH, $(v8_a_nosimd_variants), \
90			     march?armv8-a=march?armv8-a$(ARCH))
91
92# ARMv8 with SIMD: map down to base arch + simd
93MULTILIB_MATCHES	+= march?armv8-a+simd=march?armv8-a+crc+simd \
94			   $(foreach ARCH, $(filter-out +simd, $(v8_a_simd_variants)), \
95			     march?armv8-a+simd=march?armv8-a$(ARCH) \
96			     march?armv8-a+simd=march?armv8-a+crc$(ARCH))
97
98# Baseline v8.1-a: map down to baseline v8-a
99MULTILIB_MATCHES	+= march?armv8-a=march?armv8.1-a
100
101# Map all v8.1-a SIMD variants to v8-a+simd
102MULTILIB_MATCHES	+= $(foreach ARCH, $(v8_1_a_simd_variants), \
103			     march?armv8-a+simd=march?armv8.1-a$(ARCH))
104
105# Baseline v8.2-a: map down to baseline v8-a
106MULTILIB_MATCHES	+= march?armv8-a=march?armv8.2-a
107
108# Baseline v8.3-a: map down to baseline v8-a
109MULTILIB_MATCHES	+= march?armv8-a=march?armv8.3-a
110
111# Map all v8.2-a and v8.3-a SIMD variants to v8-a+simd
112MULTILIB_MATCHES	+= $(foreach ARCH, $(v8_2_a_simd_variants), \
113			     march?armv8-a+simd=march?armv8.2-a$(ARCH) \
114			     march?armv8-a+simd=march?armv8.3-a$(ARCH))
115
116# Baseline v8.4-a: map down to baseline v8-a
117MULTILIB_MATCHES	+= march?armv8-a=march?armv8.4-a
118
119# Map all v8.4-a SIMD variants to v8-a+simd
120MULTILIB_MATCHES	+= $(foreach ARCH, $(v8_4_a_simd_variants), \
121			     march?armv8-a+simd=march?armv8.4-a$(ARCH))
122
123# Baseline v8.5-a: map down to baseline v8-a
124MULTILIB_MATCHES	+= march?armv8-a=march?armv8.5-a
125
126# Map all v8.5-a SIMD variants to v8-a+simd
127MULTILIB_MATCHES	+= $(foreach ARCH, $(v8_5_a_simd_variants), \
128			     march?armv8-a+simd=march?armv8.5-a$(ARCH))
129
130# Baseline v8.6-a: map down to baseline v8-a
131MULTILIB_MATCHES	+= march?armv8-a=march?armv8.6-a
132
133# Map all v8.6-a SIMD variants to v8-a+simd
134MULTILIB_MATCHES	+= $(foreach ARCH, $(v8_6_a_simd_variants), \
135			     march?armv8-a+simd=march?armv8.6-a$(ARCH))
136
137# Armv9 without SIMD: map down to base architecture
138MULTILIB_MATCHES	+= $(foreach ARCH, $(v9_a_nosimd_variants), \
139			     march?armv9-a=march?armv9-a$(ARCH))
140
141# Armv9 with SIMD: map down to base arch + simd
142MULTILIB_MATCHES	+= march?armv9-a+simd=march?armv9-a+crc+simd \
143			   $(foreach ARCH, $(filter-out +simd, $(v9_a_simd_variants)), \
144			     march?armv9-a+simd=march?armv9-a$(ARCH) \
145			     march?armv9-a+simd=march?armv9-a+crc$(ARCH))
146
147# Use Thumb libraries for everything.
148
149MULTILIB_REUSE		+= mthumb/march.armv7-a/mfloat-abi.soft=marm/march.armv7-a/mfloat-abi.soft
150
151MULTILIB_REUSE		+= mthumb/march.armv8-a/mfloat-abi.soft=marm/march.armv8-a/mfloat-abi.soft
152
153MULTILIB_REUSE		+= mthumb/march.armv9-a/mfloat-abi.soft=marm/march.armv9-a/mfloat-abi.soft
154
155MULTILIB_REUSE		+= $(foreach ABI, hard softfp, \
156			     $(foreach ARCH, armv7-a+fp armv7-a+simd armv7ve+simd armv8-a+simd armv9-a+simd, \
157			       mthumb/march.$(ARCH)/mfloat-abi.$(ABI)=marm/march.$(ARCH)/mfloat-abi.$(ABI)))
158
159# Softfp but no FP, use the soft-float libraries.
160MULTILIB_REUSE		+= $(foreach MODE, arm thumb, \
161			     $(foreach ARCH, armv7-a armv8-a armv9-a, \
162			       mthumb/march.$(ARCH)/mfloat-abi.soft=m$(MODE)/march.$(ARCH)/mfloat-abi.softfp))
163