[AArch64] Enable CLI for Armv8.6-A f64mm
authorMatthew Malcomson <matthew.malcomson@arm.com>
Fri, 17 Jan 2020 11:22:28 +0000 (11:22 +0000)
committerMatthew Malcomson <matthew.malcomson@arm.com>
Fri, 17 Jan 2020 15:05:12 +0000 (15:05 +0000)
This patch is necessary for sve-ld1ro intrinsic I posted in
https://gcc.gnu.org/ml/gcc-patches/2020-01/msg00466.html .

I had mistakenly thought this option was already enabled upstream.

This provides the option +f64mm, that turns on the 64 bit floating point
matrix multiply extension.  This extension is only available for
AArch64.  Turning on this extension also turns on the SVE extension.

This extension is optional and only available at Armv8.2-A and onward.

We also add the ACLE defined macro for this extension.

gcc/ChangeLog:

2020-01-17  Matthew Malcomson  <matthew.malcomson@arm.com>

* config/aarch64/aarch64-c.c (_ARM_FEATURE_MATMUL_FLOAT64):
Introduce this ACLE specified predefined macro.
* config/aarch64/aarch64-option-extensions.def (f64mm): New.
(fp): Disabling this disables f64mm.
(simd): Disabling this disables f64mm.
(fp16): Disabling this disables f64mm.
(sve): Disabling this disables f64mm.
* config/aarch64/aarch64.h (AARCH64_FL_F64MM): New.
(AARCH64_ISA_F64MM): New.
(TARGET_F64MM): New.
* doc/invoke.texi (f64mm): Document new option.

gcc/testsuite/ChangeLog:

2020-01-17  Matthew Malcomson  <matthew.malcomson@arm.com>

* gcc.target/aarch64/pragma_cpp_predefs_2.c: Check for f64mm
predef.

gcc/ChangeLog
gcc/config/aarch64/aarch64-c.c
gcc/config/aarch64/aarch64-option-extensions.def
gcc/config/aarch64/aarch64.h
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_2.c

index debd4d76a037e0e81615c3694cfb47cac040dfef..39914e1083f66f968c83595500fc7e734db8221e 100644 (file)
@@ -1,3 +1,17 @@
+2020-01-17  Matthew Malcomson  <matthew.malcomson@arm.com>
+
+       * config/aarch64/aarch64-c.c (_ARM_FEATURE_MATMUL_FLOAT64):
+       Introduce this ACLE specified predefined macro.
+       * config/aarch64/aarch64-option-extensions.def (f64mm): New.
+       (fp): Disabling this disables f64mm.
+       (simd): Disabling this disables f64mm.
+       (fp16): Disabling this disables f64mm.
+       (sve): Disabling this disables f64mm.
+       * config/aarch64/aarch64.h (AARCH64_FL_F64MM): New.
+       (AARCH64_ISA_F64MM): New.
+       (TARGET_F64MM): New.
+       * doc/invoke.texi (f64mm): Document new option.
+
 2020-01-17  Wilco Dijkstra  <wdijkstr@arm.com>
 
        * config/aarch64/aarch64.c (generic_tunings): Add branch fusion.
index b422530af2020498fa683d22574b82b81ec71140..00201056f4aa3310a1fa85abed5c2366e33e1a69 100644 (file)
@@ -171,6 +171,7 @@ aarch64_update_cpp_builtins (cpp_reader *pfile)
   aarch64_def_or_undef (TARGET_MEMTAG, "__ARM_FEATURE_MEMORY_TAGGING", pfile);
 
   aarch64_def_or_undef (TARGET_I8MM, "__ARM_FEATURE_MATMUL_INT8", pfile);
+  aarch64_def_or_undef (TARGET_F64MM, "__ARM_FEATURE_MATMUL_FP64", pfile);
   aarch64_def_or_undef (TARGET_BF16_SIMD,
                        "__ARM_FEATURE_BF16_VECTOR_ARITHMETIC", pfile);
   aarch64_def_or_undef (TARGET_BF16_FP,
index 5022a1b3552f35364e35b3955bf2c39a33ab0752..548f3e20293b7a650eb6bca840e0df53bd51a053 100644 (file)
 /* Enabling "fp" just enables "fp".
    Disabling "fp" also disables "simd", "crypto", "fp16", "aes", "sha2",
    "sha3", sm3/sm4, "sve", "sve2", "sve2-aes", "sve2-sha3", "sve2-sm4",
-   "sve2-bitperm", "i8mm" and "bf16".  */
+   "sve2-bitperm", "i8mm", "f64mm", and "bf16".  */
 AARCH64_OPT_EXTENSION("fp", AARCH64_FL_FP, 0, AARCH64_FL_SIMD | \
                      AARCH64_FL_CRYPTO | AARCH64_FL_F16 | AARCH64_FL_AES | \
                      AARCH64_FL_SHA2 | AARCH64_FL_SHA3 | AARCH64_FL_SM4 | \
                      AARCH64_FL_SVE | AARCH64_FL_SVE2 | AARCH64_FL_SVE2_AES | \
                      AARCH64_FL_SVE2_SHA3 | AARCH64_FL_SVE2_SM4 | \
                      AARCH64_FL_SVE2_BITPERM | AARCH64_FL_I8MM | \
-                     AARCH64_FL_BF16, false, "fp")
+                     AARCH64_FL_F64MM | AARCH64_FL_BF16, false, "fp")
 
 /* Enabling "simd" also enables "fp".
    Disabling "simd" also disables "crypto", "dotprod", "aes", "sha2", "sha3",
    "sm3/sm4", "sve", "sve2", "sve2-aes", "sve2-sha3", "sve2-sm4",
-   "sve2-bitperm", and "i8mm".  */
+   "sve2-bitperm", "i8mm", and "f64mm".  */
 AARCH64_OPT_EXTENSION("simd", AARCH64_FL_SIMD, AARCH64_FL_FP, \
                      AARCH64_FL_CRYPTO | AARCH64_FL_DOTPROD | \
                      AARCH64_FL_AES | AARCH64_FL_SHA2 | AARCH64_FL_SHA3 | \
                      AARCH64_FL_SM4 | AARCH64_FL_SVE | AARCH64_FL_SVE2 | \
                      AARCH64_FL_SVE2_AES | AARCH64_FL_SVE2_SHA3 | \
                      AARCH64_FL_SVE2_SM4 | AARCH64_FL_SVE2_BITPERM | \
-                     AARCH64_FL_I8MM, false, \
+                     AARCH64_FL_I8MM | AARCH64_FL_F64MM, false, \
                      "asimd")
 
 /* Enabling "crypto" also enables "fp", "simd", "aes" and "sha2".
@@ -92,12 +92,13 @@ AARCH64_OPT_EXTENSION("crc", AARCH64_FL_CRC, 0, 0, false, "crc32")
 AARCH64_OPT_EXTENSION("lse", AARCH64_FL_LSE, 0, 0, false, "atomics")
 
 /* Enabling "fp16" also enables "fp".
-   Disabling "fp16" disables "fp16", "fp16fml", "sve", "sve2", "sve2-aes",
-   "sve2-sha3", "sve2-sm4", and "bitperm".  */
+   Disabling "fp16" disables "fp16", "fp16fml", "sve", "sve2",
+   "sve2-aes", "sve2-sha3", "sve2-sm4", "sve2-bitperm", and "f64mm".  */
 AARCH64_OPT_EXTENSION("fp16", AARCH64_FL_F16, AARCH64_FL_FP, \
-                     AARCH64_FL_F16FML | AARCH64_FL_SVE | AARCH64_FL_SVE2 | \
-                     AARCH64_FL_SVE2_AES | AARCH64_FL_SVE2_SHA3 | \
-                     AARCH64_FL_SVE2_SM4 | AARCH64_FL_SVE2_BITPERM, false, \
+                     AARCH64_FL_F16FML | AARCH64_FL_SVE | AARCH64_FL_F64MM | \
+                     AARCH64_FL_SVE2 | AARCH64_FL_SVE2_AES | \
+                     AARCH64_FL_SVE2_SHA3 | AARCH64_FL_SVE2_SM4 | \
+                     AARCH64_FL_SVE2_BITPERM, false, \
                      "fphp asimdhp")
 
 /* Enabling or disabling "rcpc" only changes "rcpc".  */
@@ -140,12 +141,13 @@ AARCH64_OPT_EXTENSION("fp16fml", AARCH64_FL_F16FML, \
                      AARCH64_FL_FP | AARCH64_FL_F16, 0, false, "asimdfhm")
 
 /* Enabling "sve" also enables "fp16", "fp" and "simd".
-   Disabling "sve" disables "sve", "sve2", "sve2-aes", "sve2-sha3", "sve2-sm4"
-   and "sve2-bitperm".  */
+   Disabling "sve" disables "sve", "f64mm", "sve2", "sve2-aes", "sve2-sha3",
+   "sve2-sm4" and "sve2-bitperm".  */
 AARCH64_OPT_EXTENSION("sve", AARCH64_FL_SVE, AARCH64_FL_FP | AARCH64_FL_SIMD | \
-                     AARCH64_FL_F16, AARCH64_FL_SVE2 | AARCH64_FL_SVE2_AES | \
-                     AARCH64_FL_SVE2_SHA3 | AARCH64_FL_SVE2_SM4 | \
-                     AARCH64_FL_SVE2_BITPERM, false, "sve")
+                     AARCH64_FL_F16, AARCH64_FL_F64MM | AARCH64_FL_SVE2 | \
+                     AARCH64_FL_SVE2_AES | AARCH64_FL_SVE2_SHA3 | \
+                     AARCH64_FL_SVE2_SM4 | AARCH64_FL_SVE2_BITPERM, \
+                     false, "sve")
 
 /* Enabling/Disabling "profile" does not enable/disable any other feature.  */
 AARCH64_OPT_EXTENSION("profile", AARCH64_FL_PROFILE, 0, 0, false, "")
@@ -205,6 +207,12 @@ AARCH64_OPT_EXTENSION("tme", AARCH64_FL_TME, 0, 0, false, "")
 AARCH64_OPT_EXTENSION("i8mm", AARCH64_FL_I8MM, \
                      AARCH64_FL_SIMD | AARCH64_FL_FP, 0, false, "i8mm")
 
+/* Enabling "f64mm" also enables "sve", "fp16", "fp", and "simd".
+   Disabling "f64mm" only disables "f64mm".  */
+AARCH64_OPT_EXTENSION("f64mm", AARCH64_FL_F64MM, \
+                     AARCH64_FL_SVE | AARCH64_FL_F16 | AARCH64_FL_FP | \
+                     AARCH64_FL_SIMD, 0, false, "f64mm")
+
 /* Enabling "bf16" also enables "simd" and "fp".
    Disabling "bf16" only disables "bf16".  */
 AARCH64_OPT_EXTENSION("bf16", AARCH64_FL_BF16, \
index f46b01c0ff8bcb4547d127cab81d684793f85116..eac2d62d63c8cc88fb1fe566cf95a4c56bb5bb4c 100644 (file)
@@ -211,6 +211,9 @@ extern unsigned aarch64_architecture_version;
 /* Brain half-precision floating-point (BFloat16) Extension.  */
 #define AARCH64_FL_BF16              (1ULL << 36)
 
+/* 8-bit Integer Matrix Multiply (F64MM) extensions.  */
+#define AARCH64_FL_F64MM      (1ULL << 37)
+
 /* Has FP and SIMD.  */
 #define AARCH64_FL_FPSIMD     (AARCH64_FL_FP | AARCH64_FL_SIMD)
 
@@ -267,6 +270,7 @@ extern unsigned aarch64_architecture_version;
 #define AARCH64_ISA_MEMTAG        (aarch64_isa_flags & AARCH64_FL_MEMTAG)
 #define AARCH64_ISA_V8_6          (aarch64_isa_flags & AARCH64_FL_V8_6)
 #define AARCH64_ISA_I8MM          (aarch64_isa_flags & AARCH64_FL_I8MM)
+#define AARCH64_ISA_F64MM         (aarch64_isa_flags & AARCH64_FL_F64MM)
 #define AARCH64_ISA_BF16          (aarch64_isa_flags & AARCH64_FL_BF16)
 
 /* Crypto is an optional extension to AdvSIMD.  */
@@ -342,6 +346,9 @@ extern unsigned aarch64_architecture_version;
 /* I8MM instructions are enabled through +i8mm.  */
 #define TARGET_I8MM (AARCH64_ISA_I8MM)
 
+/* F64MM instructions are enabled through +f64mm.  */
+#define TARGET_F64MM (AARCH64_ISA_F64MM)
+
 /* BF16 instructions are enabled through +bf16.  */
 #define TARGET_BF16_FP (AARCH64_ISA_BF16)
 #define TARGET_BF16_SIMD (AARCH64_ISA_BF16 && TARGET_SIMD)
index 2bf12a669aad5d9401c70b4b88e5f9e2d4f0376a..355bf1b247ab4fe614ec29ab6fdb6ef0eb16df6f 100644 (file)
@@ -16970,6 +16970,10 @@ Enable 8-bit Integer Matrix Multiply instructions.  This also enables
 Advanced SIMD and floating-point instructions.  This option is enabled by
 default for @option{-march=armv8.6-a}.  Use of this option with architectures
 prior to Armv8.2-A is not supported.
+@item f64mm
+Enable 64-bit Floating point Matrix Multiply instructions.  This also enables
+SVE instructions.  Use of this option with architectures prior to Armv8.2-A is
+not supported.
 @item bf16
 Enable brain half-precision floating-point instructions.  This also enables
 Advanced SIMD and floating-point instructions.  This option is enabled by
index 53c7efcd152af927bd3046ef7bb29a2ef0e7d549..de3fe13dabf74595f7e7c3a5335c6653974df1f7 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-17  Matthew Malcomson  <matthew.malcomson@arm.com>
+
+       * gcc.target/aarch64/pragma_cpp_predefs_2.c: Check for f64mm
+       predef.
+
 2020-01-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/93228
index f61d635bd2abc9fd8ddfb6dc77933de45ca833ee..27d475f3cc0dc9debd4e58f010bb54f44f6ca5b6 100644 (file)
 #error "__ARM_FEATURE_MATMUL_INT8 is defined but should not be!"
 #endif
 
+#ifdef __ARM_FEATURE_MATMUL_FP64
+#error "__ARM_FEATURE_MATMUL_FP64 is defined but should not be!"
+#endif
+
 #pragma GCC push_options
 #pragma GCC target ("arch=armv8.6-a")
 #ifndef __ARM_FEATURE_MATMUL_INT8
 #error "__ARM_FEATURE_MATMUL_INT8 is not defined but should be!"
 #endif
+#ifdef __ARM_FEATURE_MATMUL_FP64
+#error "__ARM_FEATURE_MATMUL_FP64 is defined but should not be!"
+#endif
 #pragma GCC pop_options
 
 #pragma GCC push_options
 #endif
 #pragma GCC pop_options
 
+#pragma GCC push_options
+#pragma GCC target ("arch=armv8.2-a+f64mm")
+#ifndef __ARM_FEATURE_MATMUL_FP64
+#error "__ARM_FEATURE_MATMUL_FP64 is not defined but should be!"
+#endif
+#pragma GCC pop_options
+
 #pragma GCC push_options
 #pragma GCC target ("arch=armv8.6-a+nosimd")
 #ifdef __ARM_FEATURE_MATMUL_INT8