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