From 946c6c45122d8a4053bf464b09e0f78d3875ae59 Mon Sep 17 00:00:00 2001 From: Kyrylo Tkachov Date: Thu, 11 Jan 2018 15:18:04 +0000 Subject: [PATCH] [arm][1/3] Add -march=armv8.4-a option This patch adds support for the Armv8.4-A architecture [1] in the arm backend. This is done through the new -march=armv8.4-a option. With this patch armv8.4-a is recognised as an argument and supports the extensions: simd, fp16, crypto, nocrypto, nofp with the familiar meaning of these options. Worth noting that there is no dotprod option like in armv8.2-a and armv8.3-a because Dot Product support is mandatory in Armv8.4-A when simd is available, so when using +simd (of fp16 which enables +simd), the +dotprod is implied. The various multilib selection makefile fragments are updated too and the mutlilib.exp test gets a few armv8.4-a combination tests. Bootstrapped and tested on arm-none-linux-gnueabihf. From-SVN: r256537 --- gcc/ChangeLog | 12 ++++++++++++ gcc/config/arm/arm-cpus.in | 17 +++++++++++++++++ gcc/config/arm/arm-tables.opt | 13 ++++++++----- gcc/config/arm/t-aprofile | 7 +++++++ gcc/config/arm/t-arm-elf | 2 +- gcc/config/arm/t-multilib | 9 ++++++++- gcc/doc/invoke.texi | 23 +++++++++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/arm/multilib.exp | 8 ++++++++ 9 files changed, 89 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 59b43b42ad3..6203382d553 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2017-01-11 Kyrylo Tkachov + + * config/arm/arm-cpus.in (armv8_4): New feature. + (ARMv8_4a): New fgroup. + (armv8.4-a): New arch. + * config/arm/arm-tables.opt: Regenerate. + * config/arm/t-aprofile: Add matching rules for -march=armv8.4-a. + * config/arm/t-arm-elf (all_v8_archs): Add armv8.4-a. + * config/arm/t-multilib (v8_4_a_simd_variants): New variable. + Add matching rules for -march=armv8.4-a and extensions. + * doc/invoke.texi (ARM Options): Document -march=armv8.4-a. + 2018-01-11 Oleg Endo PR target/81821 diff --git a/gcc/config/arm/arm-cpus.in b/gcc/config/arm/arm-cpus.in index 11f3017d546..2ea407115d0 100644 --- a/gcc/config/arm/arm-cpus.in +++ b/gcc/config/arm/arm-cpus.in @@ -120,6 +120,9 @@ define feature armv8_2 # Architecture rel 8.3. define feature armv8_3 +# Architecture rel 8.4. +define feature armv8_4 + # M-Profile security extensions. define feature cmse @@ -242,6 +245,7 @@ define fgroup ARMv8a ARMv7ve armv8 define fgroup ARMv8_1a ARMv8a crc32 armv8_1 define fgroup ARMv8_2a ARMv8_1a armv8_2 define fgroup ARMv8_3a ARMv8_2a armv8_3 +define fgroup ARMv8_4a ARMv8_3a armv8_4 define fgroup ARMv8m_base ARMv6m armv8 cmse tdiv define fgroup ARMv8m_main ARMv7m armv8 cmse define fgroup ARMv8r ARMv8a @@ -597,6 +601,19 @@ begin arch armv8.3-a option dotprod add FP_ARMv8 DOTPROD end arch armv8.3-a +begin arch armv8.4-a + tune for cortex-a53 + tune flags CO_PROC + base 8A + profile A + isa ARMv8_4a + option simd add FP_ARMv8 DOTPROD + option fp16 add fp16 FP_ARMv8 DOTPROD + option crypto add FP_ARMv8 CRYPTO DOTPROD + option nocrypto remove ALL_CRYPTO + option nofp remove ALL_FP +end arch armv8.4-a + begin arch armv8-m.base tune for cortex-m23 base 8M_BASE diff --git a/gcc/config/arm/arm-tables.opt b/gcc/config/arm/arm-tables.opt index 54fb87bd594..60e5065b398 100644 --- a/gcc/config/arm/arm-tables.opt +++ b/gcc/config/arm/arm-tables.opt @@ -455,19 +455,22 @@ EnumValue Enum(arm_arch) String(armv8.3-a) Value(29) EnumValue -Enum(arm_arch) String(armv8-m.base) Value(30) +Enum(arm_arch) String(armv8.4-a) Value(30) EnumValue -Enum(arm_arch) String(armv8-m.main) Value(31) +Enum(arm_arch) String(armv8-m.base) Value(31) EnumValue -Enum(arm_arch) String(armv8-r) Value(32) +Enum(arm_arch) String(armv8-m.main) Value(32) EnumValue -Enum(arm_arch) String(iwmmxt) Value(33) +Enum(arm_arch) String(armv8-r) Value(33) EnumValue -Enum(arm_arch) String(iwmmxt2) Value(34) +Enum(arm_arch) String(iwmmxt) Value(34) + +EnumValue +Enum(arm_arch) String(iwmmxt2) Value(35) Enum Name(arm_fpu) Type(enum fpu_type) diff --git a/gcc/config/arm/t-aprofile b/gcc/config/arm/t-aprofile index 6c34c09cc15..7b55599d429 100644 --- a/gcc/config/arm/t-aprofile +++ b/gcc/config/arm/t-aprofile @@ -96,6 +96,13 @@ MULTILIB_MATCHES += $(foreach ARCH, $(v8_2_a_simd_variants), \ march?armv8-a+simd=march?armv8.2-a$(ARCH) \ march?armv8-a+simd=march?armv8.3-a$(ARCH)) +# Baseline v8.4-a: map down to baseline v8-a +MULTILIB_MATCHES += march?armv8-a=march?armv8.4-a + +# Map all v8.4-a SIMD variants to v8-a+simd +MULTILIB_MATCHES += $(foreach ARCH, $(v8_4_a_simd_variants), \ + march?armv8-a+simd=march?armv8.4-a$(ARCH)) + # Use Thumb libraries for everything. MULTILIB_REUSE += mthumb/march.armv7-a/mfloat-abi.soft=marm/march.armv7-a/mfloat-abi.soft diff --git a/gcc/config/arm/t-arm-elf b/gcc/config/arm/t-arm-elf index 189ab9beb00..afc763c99eb 100644 --- a/gcc/config/arm/t-arm-elf +++ b/gcc/config/arm/t-arm-elf @@ -46,7 +46,7 @@ all_early_arch := armv5e armv5tej armv6 armv6j armv6k armv6z armv6kz \ all_v7_a_r := armv7-a armv7ve armv7-r -all_v8_archs := armv8-a armv8-a+crc armv8.1-a armv8.2-a armv8.3-a +all_v8_archs := armv8-a armv8-a+crc armv8.1-a armv8.2-a armv8.3-a armv8.4-a # No floating point variants, require thumb1 softfp all_nofp_t := armv6-m armv6s-m armv8-m.base diff --git a/gcc/config/arm/t-multilib b/gcc/config/arm/t-multilib index c0ca255c017..c25a8371642 100644 --- a/gcc/config/arm/t-multilib +++ b/gcc/config/arm/t-multilib @@ -69,7 +69,7 @@ v8_a_nosimd_variants := +crc v8_a_simd_variants := $(call all_feat_combs, simd crypto) v8_1_a_simd_variants := $(call all_feat_combs, simd crypto) v8_2_a_simd_variants := $(call all_feat_combs, simd fp16 crypto dotprod) - +v8_4_a_simd_variants := $(call all_feat_combs, simd fp16 crypto) ifneq (,$(HAS_APROFILE)) include $(srcdir)/config/arm/t-aprofile @@ -147,6 +147,13 @@ MULTILIB_MATCHES += $(foreach ARCH, $(v8_2_a_simd_variants), \ march?armv7+fp=march?armv8.2-a$(ARCH) \ march?armv7+fp=march?armv8.3-a$(ARCH)) +# Baseline v8.4-a: map down to baseline v8-a +MULTILIB_MATCHES += march?armv7=march?armv8.4-a + +# Map all v8.4-a SIMD variants +MULTILIB_MATCHES += $(foreach ARCH, $(v8_4_a_simd_variants), \ + march?armv7+fp=march?armv8.4-a$(ARCH)) + # Use Thumb libraries for everything. MULTILIB_REUSE += mthumb/march.armv7/mfloat-abi.soft=marm/march.armv7/mfloat-abi.soft diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index e4768b84b44..99c2214fb1b 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -15676,6 +15676,7 @@ Permissible names are: @samp{armv6z}, @samp{armv6zk}, @samp{armv7}, @samp{armv7-a}, @samp{armv7ve}, @samp{armv8-a}, @samp{armv8.1-a}, @samp{armv8.2-a}, @samp{armv8.3-a}, +@samp{armv8.4-a}, @samp{armv7-r}, @samp{armv8-r}, @samp{armv6-m}, @samp{armv6s-m}, @@ -15897,6 +15898,28 @@ Disable the cryptographic extension. Disable the floating-point, Advanced SIMD and cryptographic instructions. @end table +@item armv8.4-a +@table @samp +@item +fp16 +The half-precision floating-point data processing instructions. +This also enables the Advanced SIMD and floating-point instructions as well +as the Dot Product extension. + +@item +simd +The ARMv8.3-A Advanced SIMD and floating-point instructions as well as the +Dot Product extension. + +@item +crypto +The cryptographic instructions. This also enables the Advanced SIMD and +floating-point instructions as well as the Dot Product extension. + +@item +nocrypto +Disable the cryptographic extension. + +@item +nofp +Disable the floating-point, Advanced SIMD and cryptographic instructions. +@end table + @item armv7-r @table @samp @item +fp.sp diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fde8bcc383e..224bfc581f1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-01-11 Kyrylo Tkachov + + * gcc.target/arm/multilib.exp: Add some -march=armv8.4-a + combination tests. + 2018-01-11 Richard Biener PR tree-optimization/83435 diff --git a/gcc/testsuite/gcc.target/arm/multilib.exp b/gcc/testsuite/gcc.target/arm/multilib.exp index c3c8e1f919d..88e98260132 100644 --- a/gcc/testsuite/gcc.target/arm/multilib.exp +++ b/gcc/testsuite/gcc.target/arm/multilib.exp @@ -92,6 +92,14 @@ if {[multilib_config "aprofile"] } { {-march=armv8.3-a+simd+dotprod -mfloat-abi=softfp} "thumb/v8-a+simd/softfp" {-march=armv8.3-a+simd+dotprod+nofp -mfloat-abi=softfp} "thumb/v8-a/nofp" {-march=armv8.3-a+simd+nofp+dotprod -mfloat-abi=softfp} "thumb/v8-a+simd/softfp" + {-march=armv8.4-a+crypto -mfloat-abi=soft} "thumb/v8-a/nofp" + {-march=armv8.4-a+simd+crypto -mfloat-abi=softfp} "thumb/v8-a+simd/softfp" + {-march=armv8.4-a+simd+crypto+nofp -mfloat-abi=softfp} "thumb/v8-a/nofp" + {-march=armv8.4-a+simd+nofp+crypto -mfloat-abi=softfp} "thumb/v8-a+simd/softfp" + {-march=armv8.4-a+fp16 -mfloat-abi=soft} "thumb/v8-a/nofp" + {-march=armv8.4-a+simd+fp16 -mfloat-abi=softfp} "thumb/v8-a+simd/softfp" + {-march=armv8.4-a+simd+fp16+nofp -mfloat-abi=softfp} "thumb/v8-a/nofp" + {-march=armv8.4-a+simd+nofp+fp16 -mfloat-abi=softfp} "thumb/v8-a+simd/softfp" {-mcpu=cortex-a53+crypto -mfloat-abi=hard} "thumb/v8-a+simd/hard" {-mcpu=cortex-a53+nofp -mfloat-abi=softfp} "thumb/v8-a/nofp" {-march=armv8-a+crc -mfloat-abi=hard -mfpu=vfp} "thumb/v8-a+simd/hard" -- 2.30.2