[arm][1/3] Add -march=armv8.4-a option
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Thu, 11 Jan 2018 15:18:04 +0000 (15:18 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Thu, 11 Jan 2018 15:18:04 +0000 (15:18 +0000)
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
gcc/config/arm/arm-cpus.in
gcc/config/arm/arm-tables.opt
gcc/config/arm/t-aprofile
gcc/config/arm/t-arm-elf
gcc/config/arm/t-multilib
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/multilib.exp

index 59b43b42ad3b95135fbfeffd3481369aa9bed65f..6203382d553d728960600cc420cb18cbfe9cea4d 100644 (file)
@@ -1,3 +1,15 @@
+2017-01-11  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * 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  <olegendo@gcc.gnu.org>
 
        PR target/81821
index 11f3017d546199e2f110d5938ded4fd15cf39ecd..2ea407115d0f29bc77ca839bf2bbdd2e13adfd90 100644 (file)
@@ -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
index 54fb87bd5944d9a17c13d185120dbcb2d4a51130..60e5065b398f40bf969a53fd063d263908b0818e 100644 (file)
@@ -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)
index 6c34c09cc15ff53526a682553270132795a24b51..7b55599d42947fea880483bf0a7a62f33bb1a1fb 100644 (file)
@@ -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
index 189ab9beb00561a53e34d479a45038a8bc47585d..afc763c99eb2ada12497b16269e021570f4a892e 100644 (file)
@@ -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
index c0ca255c0175aef6745cb82e972c97f5a7240a29..c25a83716423fb5e5663ebe2e04b4e46da803b14 100644 (file)
@@ -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
index e4768b84b441a9afc4913fc31c2a2c3aaf7c7faf..99c2214fb1b12dba682e0a92dc1b1c8eef7e655c 100644 (file)
@@ -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
index fde8bcc383e19021f908a81884be21337eed95af..224bfc581f1cb48e304ea741357379e60169df2a 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-11  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * gcc.target/arm/multilib.exp: Add some -march=armv8.4-a
+       combination tests.
+
 2018-01-11  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/83435
index c3c8e1f919dedb3ecdf0b9dc20df506efcd8d91a..88e98260132394f736ac87c34514a5711c350a5b 100644 (file)
@@ -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"