public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/ARM/heads/morello)] aarch64: Fixes for purecap and arm_neon.h
@ 2021-09-21  9:12 Matthew Malcomson
  0 siblings, 0 replies; only message in thread
From: Matthew Malcomson @ 2021-09-21  9:12 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:c674828a8180a184f1aa4918e62616e2c73ae2b2

commit c674828a8180a184f1aa4918e62616e2c73ae2b2
Author: Alex Coplan <alex.coplan@arm.com>
Date:   Tue Jul 20 11:14:54 2021 +0100

    aarch64: Fixes for purecap and arm_neon.h
    
    Various headers in the AArch64 backend reset the architecture level
    temporarily. This is problematic for purecap Morello, since
    -mabi=purecap requires the C64 extension in the architecture features.
    There are two main ways that the architecture level can be reset by
    these headers. One is with:
    
    #pragma GCC target ("+nothing+...")
    
    and the other is:
    
    #pragma GCC target ("-march=armv8.x[+...]")
    
    To work around the first form, we tweak the meaning of +nothing in the
    AArch64 backend to preserve the C64 extension. To work around the second
    form, we introduce #ifdefs in the various headers to ensure we preserve
    the C64 extension in these cases.
    
    gcc/ChangeLog:
    
            * config/aarch64/aarch64.c (aarch64_handle_attr_isa_flags): Make
            +nothing preserve the C64 extension.
            * config/aarch64/arm_fp16.h: Insert #ifdefs to avoid clearing
            the C64 extension.
            * config/aarch64/arm_neon.h: Likewise.

Diff:
---
 gcc/config/aarch64/aarch64.c  |  4 +++-
 gcc/config/aarch64/arm_fp16.h |  5 +++++
 gcc/config/aarch64/arm_neon.h | 45 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 8123dc72e96..d68bbb1a4aa 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -15788,7 +15788,9 @@ aarch64_handle_attr_isa_flags (char *str)
      features if the user wants to handpick specific features.  */
   if (strncmp ("+nothing", str, 8) == 0)
     {
-      isa_flags = 0;
+      /* For Morello, don't disable C64 as this will break any code compiled
+	 with -mabi=purecap.  */
+      isa_flags &= AARCH64_FL_C64;
       str += 8;
     }
 
diff --git a/gcc/config/aarch64/arm_fp16.h b/gcc/config/aarch64/arm_fp16.h
index 65876151b29..b1c40ea6044 100644
--- a/gcc/config/aarch64/arm_fp16.h
+++ b/gcc/config/aarch64/arm_fp16.h
@@ -30,7 +30,12 @@
 #include <stdint.h>
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=morello+c64+fp16")
+#else
 #pragma GCC target ("arch=armv8.2-a+fp16")
+#endif
 
 typedef __fp16 float16_t;
 
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index 50f8b23bc17..412befdb8c1 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -32212,7 +32212,12 @@ __INTERLEAVE_LIST (zip)
 #include "arm_fp16.h"
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=morello+c64+fp16")
+#else
 #pragma GCC target ("arch=armv8.2-a+fp16")
+#endif
 
 /* ARMv8.2-A FP16 one operand vector intrinsics.  */
 
@@ -33375,7 +33380,12 @@ vminnmvq_f16 (float16x8_t __a)
 /* AdvSIMD Dot Product intrinsics.  */
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=morello+c64")
+#else
 #pragma GCC target ("arch=armv8.2-a+dotprod")
+#endif
 
 __extension__ extern __inline uint32x2_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
@@ -33466,7 +33476,12 @@ vdotq_laneq_s32 (int32x4_t __r, int8x16_t __a, int8x16_t __b, const int __index)
 #pragma GCC pop_options
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=morello+c64+sm4")
+#else
 #pragma GCC target ("arch=armv8.2-a+sm4")
+#endif
 
 __extension__ extern __inline uint32x4_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
@@ -33533,7 +33548,12 @@ vsm4ekeyq_u32 (uint32x4_t __a, uint32x4_t __b)
 #pragma GCC pop_options
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=morello+c64+sha3")
+#else
 #pragma GCC target ("arch=armv8.2-a+sha3")
+#endif
 
 __extension__ extern __inline uint64x2_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
@@ -33695,7 +33715,12 @@ vbcaxq_s64 (int64x2_t __a, int64x2_t __b, int64x2_t __c)
 /* AdvSIMD Complex numbers intrinsics.  */
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=armv8.3-a+c64")
+#else
 #pragma GCC target ("arch=armv8.3-a")
+#endif
 
 #pragma GCC push_options
 #pragma GCC target ("+fp16")
@@ -34169,7 +34194,12 @@ vcmlaq_rot270_laneq_f32 (float32x4_t __r, float32x4_t __a, float32x4_t __b,
 #pragma GCC pop_options
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=morello+c64")
+#else
 #pragma GCC target ("arch=armv8.2-a+fp16fml")
+#endif
 
 __extension__ extern __inline float32x2_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
@@ -34358,7 +34388,12 @@ vfmlslq_laneq_high_f16 (float32x4_t __r, float16x8_t __a, float16x8_t __b,
 #pragma GCC pop_options
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=armv8.5-a+c64")
+#else
 #pragma GCC target ("arch=armv8.5-a")
+#endif
 
 __extension__ extern __inline float32x2_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
@@ -34478,7 +34513,12 @@ vrnd64xq_f64 (float64x2_t __a)
 #include "arm_bf16.h"
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=morello+c64+bf16")
+#else
 #pragma GCC target ("arch=armv8.2-a+bf16")
+#endif
 
 __extension__ extern __inline bfloat16x4_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
@@ -35556,7 +35596,12 @@ vcvtq_high_bf16_f32 (bfloat16x8_t __inactive, float32x4_t __a)
 /* AdvSIMD 8-bit Integer Matrix Multiply (I8MM) intrinsics.  */
 
 #pragma GCC push_options
+
+#ifdef __ARM_FEATURE_C64
+#pragma GCC target ("arch=morello+c64+i8mm")
+#else
 #pragma GCC target ("arch=armv8.2-a+i8mm")
+#endif
 
 __extension__ extern __inline int32x2_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-09-21  9:12 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-21  9:12 [gcc(refs/vendors/ARM/heads/morello)] aarch64: Fixes for purecap and arm_neon.h Matthew Malcomson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).