1From e66a37acae62236611f951e706e9a2bfbd753f39 Mon Sep 17 00:00:00 2001
2From: Przemyslaw Wirkus <przemyslaw.wirkus@arm.com>
3Date: Tue, 9 Nov 2021 09:40:05 +0000
4Subject: [PATCH 4/4] arm: add armv9-a architecture to -march
5
6commit 32ba7860ccaddd5219e6dae94a3d0653e124c9dd from upstream
7
8In this patch:
9	+ Add `armv9-a` to -march.
10	+ Update multilib with armv9-a and armv9-a+simd.
11
12gcc/ChangeLog:
13
14	* config/arm/arm-cpus.in (armv9): New define.
15	(ARMv9a): New group.
16	(armv9-a): New arch definition.
17	* config/arm/arm-tables.opt: Regenerate.
18	* config/arm/arm.h (BASE_ARCH_9A): New arch enum value.
19	* config/arm/t-aprofile: Added armv9-a and armv9+simd.
20	* config/arm/t-arm-elf: Added arm9-a, v9_fps and all_v9_archs
21	to MULTILIB_MATCHES.
22	* config/arm/t-multilib: Added v9_a_nosimd_variants and
23	v9_a_simd_variants to MULTILIB_MATCHES.
24	* doc/invoke.texi: Update docs.
25
26gcc/testsuite/ChangeLog:
27
28	* gcc.target/arm/multilib.exp: Update test with armv9-a entries.
29	* lib/target-supports.exp (v9a): Add new armflag.
30	(__ARM_ARCH_9A__): Add new armdef.
31
32Upstream-Status: Backport
33Signed-off-by: Ruiqiang Hao <Ruiqiang.Hao@windriver.com>
34---
35 gcc/config/arm/arm-cpus.in                | 19 +++++++++++++++++
36 gcc/config/arm/arm-tables.opt             |  7 +++++--
37 gcc/config/arm/arm.h                      |  3 ++-
38 gcc/config/arm/t-aprofile                 | 25 +++++++++++++++++++----
39 gcc/config/arm/t-arm-elf                  |  9 ++++++++
40 gcc/config/arm/t-multilib                 | 12 +++++++++++
41 gcc/doc/invoke.texi                       |  1 +
42 gcc/testsuite/gcc.target/arm/multilib.exp |  8 ++++++++
43 gcc/testsuite/lib/target-supports.exp     |  3 ++-
44 9 files changed, 79 insertions(+), 8 deletions(-)
45
46Index: gcc-11.3.0/gcc/config/arm/arm-cpus.in
47===================================================================
48--- gcc-11.3.0.orig/gcc/config/arm/arm-cpus.in
49+++ gcc-11.3.0/gcc/config/arm/arm-cpus.in
50@@ -132,6 +132,9 @@ define feature cmse
51 # Architecture rel 8.1-M.
52 define feature armv8_1m_main
53
54+# Architecture rel 9.0.
55+define feature armv9
56+
57 # Floating point and Neon extensions.
58 # VFPv1 is not supported in GCC.
59
60@@ -293,6 +296,7 @@ define fgroup ARMv8m_base ARMv6m armv8 c
61 define fgroup ARMv8m_main ARMv7m armv8 cmse
62 define fgroup ARMv8r      ARMv8a
63 define fgroup ARMv8_1m_main ARMv8m_main armv8_1m_main
64+define fgroup ARMv9a      ARMv8_5a armv9
65
66 # Useful combinations.
67 define fgroup VFPv2	vfpv2
68@@ -751,6 +755,21 @@ begin arch armv8.1-m.main
69  option cdecp7 add cdecp7
70 end arch armv8.1-m.main
71
72+begin arch armv9-a
73+ tune for cortex-a53
74+ tune flags CO_PROC
75+ base 9A
76+ profile A
77+ isa ARMv9a
78+ option simd add FP_ARMv8 DOTPROD
79+ option fp16 add fp16 fp16fml FP_ARMv8 DOTPROD
80+ option crypto add FP_ARMv8 CRYPTO DOTPROD
81+ option nocrypto remove ALL_CRYPTO
82+ option nofp remove ALL_FP
83+ option i8mm add i8mm FP_ARMv8 DOTPROD
84+ option bf16 add bf16 FP_ARMv8 DOTPROD
85+end arch armv9-a
86+
87 begin arch iwmmxt
88  tune for iwmmxt
89  tune flags LDSCHED STRONG XSCALE
90Index: gcc-11.3.0/gcc/config/arm/arm-tables.opt
91===================================================================
92--- gcc-11.3.0.orig/gcc/config/arm/arm-tables.opt
93+++ gcc-11.3.0/gcc/config/arm/arm-tables.opt
94@@ -380,10 +380,13 @@ EnumValue
95 Enum(arm_arch) String(armv8.1-m.main) Value(30)
96
97 EnumValue
98-Enum(arm_arch) String(iwmmxt) Value(31)
99+Enum(arm_arch) String(armv9-a) Value(31)
100
101 EnumValue
102-Enum(arm_arch) String(iwmmxt2) Value(32)
103+Enum(arm_arch) String(iwmmxt) Value(32)
104+
105+EnumValue
106+Enum(arm_arch) String(iwmmxt2) Value(33)
107
108 Enum
109 Name(arm_fpu) Type(enum fpu_type)
110Index: gcc-11.3.0/gcc/config/arm/arm.h
111===================================================================
112--- gcc-11.3.0.orig/gcc/config/arm/arm.h
113+++ gcc-11.3.0/gcc/config/arm/arm.h
114@@ -456,7 +456,8 @@ enum base_architecture
115   BASE_ARCH_8A = 8,
116   BASE_ARCH_8M_BASE = 8,
117   BASE_ARCH_8M_MAIN = 8,
118-  BASE_ARCH_8R = 8
119+  BASE_ARCH_8R = 8,
120+  BASE_ARCH_9A = 9
121 };
122
123 /* The major revision number of the ARM Architecture implemented by the target.  */
124Index: gcc-11.3.0/gcc/config/arm/t-aprofile
125===================================================================
126--- gcc-11.3.0.orig/gcc/config/arm/t-aprofile
127+++ gcc-11.3.0/gcc/config/arm/t-aprofile
128@@ -26,8 +26,8 @@
129
130 # Arch and FPU variants to build libraries with
131
132-MULTI_ARCH_OPTS_A       = march=armv7-a/march=armv7-a+fp/march=armv7-a+simd/march=armv7ve+simd/march=armv8-a/march=armv8-a+simd
133-MULTI_ARCH_DIRS_A       = v7-a v7-a+fp v7-a+simd v7ve+simd v8-a v8-a+simd
134+MULTI_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
135+MULTI_ARCH_DIRS_A       = v7-a v7-a+fp v7-a+simd v7ve+simd v8-a v8-a+simd v9-a v9-a+simd
136
137 # ARMv7-A - build nofp, fp-d16 and SIMD variants
138
139@@ -46,6 +46,11 @@ MULTILIB_REQUIRED	+= mthumb/march=armv8-
140 MULTILIB_REQUIRED	+= mthumb/march=armv8-a+simd/mfloat-abi=hard
141 MULTILIB_REQUIRED	+= mthumb/march=armv8-a+simd/mfloat-abi=softfp
142
143+# Armv9-A - build nofp and SIMD variants.
144+MULTILIB_REQUIRED	+= mthumb/march=armv9-a/mfloat-abi=soft
145+MULTILIB_REQUIRED	+= mthumb/march=armv9-a+simd/mfloat-abi=hard
146+MULTILIB_REQUIRED	+= mthumb/march=armv9-a+simd/mfloat-abi=softfp
147+
148 # Matches
149
150 # Arch Matches
151@@ -129,17 +134,29 @@ MULTILIB_MATCHES	+= march?armv8-a=march?
152 MULTILIB_MATCHES	+= $(foreach ARCH, $(v8_6_a_simd_variants), \
153 			     march?armv8-a+simd=march?armv8.6-a$(ARCH))
154
155+# Armv9 without SIMD: map down to base architecture
156+MULTILIB_MATCHES	+= $(foreach ARCH, $(v9_a_nosimd_variants), \
157+			     march?armv9-a=march?armv9-a$(ARCH))
158+
159+# Armv9 with SIMD: map down to base arch + simd
160+MULTILIB_MATCHES	+= march?armv9-a+simd=march?armv9-a+crc+simd \
161+			   $(foreach ARCH, $(filter-out +simd, $(v9_a_simd_variants)), \
162+			     march?armv9-a+simd=march?armv9-a$(ARCH) \
163+			     march?armv9-a+simd=march?armv9-a+crc$(ARCH))
164+
165 # Use Thumb libraries for everything.
166
167 MULTILIB_REUSE		+= mthumb/march.armv7-a/mfloat-abi.soft=marm/march.armv7-a/mfloat-abi.soft
168
169 MULTILIB_REUSE		+= mthumb/march.armv8-a/mfloat-abi.soft=marm/march.armv8-a/mfloat-abi.soft
170
171+MULTILIB_REUSE		+= mthumb/march.armv9-a/mfloat-abi.soft=marm/march.armv9-a/mfloat-abi.soft
172+
173 MULTILIB_REUSE		+= $(foreach ABI, hard softfp, \
174-			     $(foreach ARCH, armv7-a+fp armv7-a+simd armv7ve+simd armv8-a+simd, \
175+			     $(foreach ARCH, armv7-a+fp armv7-a+simd armv7ve+simd armv8-a+simd armv9-a+simd, \
176 			       mthumb/march.$(ARCH)/mfloat-abi.$(ABI)=marm/march.$(ARCH)/mfloat-abi.$(ABI)))
177
178 # Softfp but no FP, use the soft-float libraries.
179 MULTILIB_REUSE		+= $(foreach MODE, arm thumb, \
180-			     $(foreach ARCH, armv7-a armv8-a, \
181+			     $(foreach ARCH, armv7-a armv8-a armv9-a, \
182 			       mthumb/march.$(ARCH)/mfloat-abi.soft=m$(MODE)/march.$(ARCH)/mfloat-abi.softfp))
183Index: gcc-11.3.0/gcc/config/arm/t-arm-elf
184===================================================================
185--- gcc-11.3.0.orig/gcc/config/arm/t-arm-elf
186+++ gcc-11.3.0/gcc/config/arm/t-arm-elf
187@@ -38,6 +38,8 @@ v7ve_fps	:= vfpv3-d16 vfpv3 vfpv3-d16-fp
188 # it seems to work ok.
189 v8_fps		:= simd fp16 crypto fp16+crypto dotprod fp16fml
190
191+v9_fps		:= simd fp16 crypto fp16+crypto dotprod fp16fml
192+
193 # We don't do anything special with these.  Pre-v4t probably doesn't work.
194 all_early_nofp	:= armv4 armv4t armv5t
195
196@@ -49,6 +51,8 @@ all_v7_a_r	:= armv7-a armv7ve armv7-r
197 all_v8_archs	:= armv8-a armv8-a+crc armv8.1-a armv8.2-a armv8.3-a armv8.4-a \
198 		   armv8.5-a armv8.6-a
199
200+all_v9_archs	:= armv9-a
201+
202 # No floating point variants, require thumb1 softfp
203 all_nofp_t	:= armv6-m armv6s-m armv8-m.base
204
205@@ -110,6 +114,11 @@ MULTILIB_MATCHES     += $(foreach ARCH,
206 			  $(foreach FPARCH, $(v8_fps), \
207 			    march?armv7+fp=march?$(ARCH)+$(FPARCH)))
208
209+MULTILIB_MATCHES     += $(foreach ARCH, $(all_v9_archs), \
210+			  march?armv7+fp=march?$(ARCH) \
211+			  $(foreach FPARCH, $(v9_fps), \
212+			    march?armv7+fp=march?$(ARCH)+$(FPARCH)))
213+
214 MULTILIB_MATCHES     += $(foreach ARCH, armv7e-m armv8-m.mainline, \
215 			  march?armv7+fp=march?$(ARCH)+fp.dp)
216
217Index: gcc-11.3.0/gcc/config/arm/t-multilib
218===================================================================
219--- gcc-11.3.0.orig/gcc/config/arm/t-multilib
220+++ gcc-11.3.0/gcc/config/arm/t-multilib
221@@ -78,6 +78,8 @@ v8_4_a_simd_variants	:= $(call all_feat_
222 v8_5_a_simd_variants	:= $(call all_feat_combs, simd fp16 crypto i8mm bf16)
223 v8_6_a_simd_variants	:= $(call all_feat_combs, simd fp16 crypto i8mm bf16)
224 v8_r_nosimd_variants	:= +crc
225+v9_a_nosimd_variants	:= +crc
226+v9_a_simd_variants	:= $(call all_feat_combs, simd fp16 crypto i8mm bf16)
227
228 ifneq (,$(HAS_APROFILE))
229 include $(srcdir)/config/arm/t-aprofile
230@@ -202,6 +204,16 @@ MULTILIB_MATCHES	+= march?armv7=march?ar
231 MULTILIB_MATCHES	+= $(foreach ARCH, $(v8_6_a_simd_variants), \
232 			     march?armv7+fp=march?armv8.6-a$(ARCH))
233
234+# Armv9
235+MULTILIB_MATCHES	+= march?armv7=march?armv9-a
236+MULTILIB_MATCHES	+= $(foreach ARCH, $(v9_a_nosimd_variants), \
237+			     march?armv7=march?armv9-a$(ARCH))
238+
239+# Armv9 with SIMD
240+MULTILIB_MATCHES	+= march?armv7+fp=march?armv9-a+crc+simd \
241+			   $(foreach ARCH, $(v9_a_simd_variants), \
242+			     march?armv7+fp=march?armv9-a$(ARCH) \
243+			     march?armv7+fp=march?armv9-a+crc$(ARCH))
244 endif		# Not APROFILE.
245
246 # Use Thumb libraries for everything.
247Index: gcc-11.3.0/gcc/doc/invoke.texi
248===================================================================
249--- gcc-11.3.0.orig/gcc/doc/invoke.texi
250+++ gcc-11.3.0/gcc/doc/invoke.texi
251@@ -19701,6 +19701,7 @@ Permissible names are:
252 @samp{armv7-m}, @samp{armv7e-m},
253 @samp{armv8-m.base}, @samp{armv8-m.main},
254 @samp{armv8.1-m.main},
255+@samp{armv9-a},
256 @samp{iwmmxt} and @samp{iwmmxt2}.
257
258 Additionally, the following architectures, which lack support for the
259Index: gcc-11.3.0/gcc/testsuite/gcc.target/arm/multilib.exp
260===================================================================
261--- gcc-11.3.0.orig/gcc/testsuite/gcc.target/arm/multilib.exp
262+++ gcc-11.3.0/gcc/testsuite/gcc.target/arm/multilib.exp
263@@ -135,6 +135,14 @@ if {[multilib_config "aprofile"] } {
264 	{-march=armv8.6-a+simd+fp16 -mfloat-abi=softfp} "thumb/v8-a+simd/softfp"
265 	{-march=armv8.6-a+simd+fp16+nofp -mfloat-abi=softfp} "thumb/v8-a/nofp"
266 	{-march=armv8.6-a+simd+nofp+fp16 -mfloat-abi=softfp} "thumb/v8-a+simd/softfp"
267+	{-march=armv9-a+crypto -mfloat-abi=soft} "thumb/v9-a/nofp"
268+	{-march=armv9-a+simd+crypto -mfloat-abi=softfp} "thumb/v9-a+simd/softfp"
269+	{-march=armv9-a+simd+crypto+nofp -mfloat-abi=softfp} "thumb/v9-a/nofp"
270+	{-march=armv9-a+simd+nofp+crypto -mfloat-abi=softfp} "thumb/v9-a+simd/softfp"
271+	{-march=armv9-a+fp16 -mfloat-abi=soft} "thumb/v9-a/nofp"
272+	{-march=armv9-a+simd+fp16 -mfloat-abi=softfp} "thumb/v9-a+simd/softfp"
273+	{-march=armv9-a+simd+fp16+nofp -mfloat-abi=softfp} "thumb/v9-a/nofp"
274+	{-march=armv9-a+simd+nofp+fp16 -mfloat-abi=softfp} "thumb/v9-a+simd/softfp"
275 	{-mcpu=cortex-a53+crypto -mfloat-abi=hard} "thumb/v8-a+simd/hard"
276 	{-mcpu=cortex-a53+nofp -mfloat-abi=softfp} "thumb/v8-a/nofp"
277 	{-march=armv8-a+crc -mfloat-abi=hard -mfpu=vfp} "thumb/v8-a+simd/hard"
278Index: gcc-11.3.0/gcc/testsuite/lib/target-supports.exp
279===================================================================
280--- gcc-11.3.0.orig/gcc/testsuite/lib/target-supports.exp
281+++ gcc-11.3.0/gcc/testsuite/lib/target-supports.exp
282@@ -4820,7 +4820,8 @@ foreach { armfunc armflag armdefs } {
283 	v8m_base "-march=armv8-m.base -mthumb -mfloat-abi=soft"
284 		__ARM_ARCH_8M_BASE__
285 	v8m_main "-march=armv8-m.main -mthumb" __ARM_ARCH_8M_MAIN__
286-	v8_1m_main "-march=armv8.1-m.main -mthumb" __ARM_ARCH_8M_MAIN__ } {
287+	v8_1m_main "-march=armv8.1-m.main -mthumb" __ARM_ARCH_8M_MAIN__
288+	v9a "-march=armv9-a" __ARM_ARCH_9A__ } {
289     eval [string map [list FUNC $armfunc FLAG $armflag DEFS $armdefs ] {
290 	proc check_effective_target_arm_arch_FUNC_ok { } {
291 	    return [check_no_compiler_messages arm_arch_FUNC_ok assembly {
292