Port the SHA256 intrinsics (FEAT_SHA2) to the pragma-based framework and add
assembly tests for each intrinsic.

gcc/ChangeLog:

        * config/aarch64/aarch64-neon-builtins-base.cc: New function
        bases.
        * config/aarch64/aarch64-neon-builtins-base.def (vsha256hq,
        vsha256h2q, vsha256su0q, vsha256su1q): New function
        definitions.
        * config/aarch64/aarch64-simd-builtins.def: Delete builtin
        functions
        * config/aarch64/arm_neon.h (vsha256hq_u32, vsha256h2q_u32,
        vsha256su0q_u32, vsha256su1q_u32): Delete functions.

gcc/testsuite/ChangeLog:

        * gcc.target/aarch64/neon/vsha256.c: New test.
---
 .../aarch64/aarch64-neon-builtins-base.cc     |  6 +++
 .../aarch64/aarch64-neon-builtins-base.def    |  8 ++++
 gcc/config/aarch64/aarch64-simd-builtins.def  |  9 +----
 gcc/config/aarch64/arm_neon.h                 | 38 -------------------
 .../gcc.target/aarch64/neon/vsha256.c         | 32 ++++++++++++++++
 5 files changed, 47 insertions(+), 46 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vsha256.c

diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc 
b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
index ef128d0de1d..f4099e99d1e 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
@@ -805,4 +805,10 @@ NEON_FUNCTION (vsha1pq,   
gimple_exact_insn<CODE_FOR_aarch64_crypto_sha1pv4si>,)
 NEON_FUNCTION (vsha1h,    gimple_exact_insn<CODE_FOR_aarch64_crypto_sha1hsi>,)
 NEON_FUNCTION (vsha1su0q, 
gimple_exact_insn<CODE_FOR_aarch64_crypto_sha1su0v4si>,)
 NEON_FUNCTION (vsha1su1q, 
gimple_exact_insn<CODE_FOR_aarch64_crypto_sha1su1v4si>,)
+
+// SHA256
+NEON_FUNCTION (vsha256hq,   
gimple_exact_insn<CODE_FOR_aarch64_crypto_sha256hv4si>,)
+NEON_FUNCTION (vsha256h2q,  
gimple_exact_insn<CODE_FOR_aarch64_crypto_sha256h2v4si>,)
+NEON_FUNCTION (vsha256su0q, 
gimple_exact_insn<CODE_FOR_aarch64_crypto_sha256su0v4si>,)
+NEON_FUNCTION (vsha256su1q, 
gimple_exact_insn<CODE_FOR_aarch64_crypto_sha256su1v4si>,)
 }
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def 
b/gcc/config/aarch64/aarch64-neon-builtins-base.def
index b0cc6d1ce92..50ddb078135 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.def
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def
@@ -162,4 +162,12 @@ DEF_NEON_FUNCTION (vsha1pq,   s_unsigned, ("Q0,Q0,s0,Q0"))
 DEF_NEON_FUNCTION (vsha1h,    s_unsigned, ("s0,s0"))
 DEF_NEON_FUNCTION (vsha1su0q, s_unsigned, ("Q0,Q0,Q0,Q0"))
 DEF_NEON_FUNCTION (vsha1su1q, s_unsigned, ("Q0,Q0,Q0"))
+#undef REQUIRED_EXTENSIONS
+
+// SHA256
+#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD | 
AARCH64_FL_SHA2)
+DEF_NEON_FUNCTION (vsha256hq,   s_unsigned, ("Q0,Q0,Q0,Q0"))
+DEF_NEON_FUNCTION (vsha256h2q,  s_unsigned, ("Q0,Q0,Q0,Q0"))
+DEF_NEON_FUNCTION (vsha256su0q, s_unsigned, ("Q0,Q0,Q0"))
+DEF_NEON_FUNCTION (vsha256su1q, s_unsigned, ("Q0,Q0,Q0,Q0"))
 #undef REQUIRED_EXTENSIONS
\ No newline at end of file
diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def 
b/gcc/config/aarch64/aarch64-simd-builtins.def
index 11d418a68a4..7c055cdb7e6 100644
--- a/gcc/config/aarch64/aarch64-simd-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-builtins.def
@@ -711,14 +711,7 @@
   BUILTIN_VDQSF (QUADOP_LANE, float_mls_lane, 0, FP)
   BUILTIN_VDQSF (QUADOP_LANE, float_mla_laneq, 0, FP)
   BUILTIN_VDQSF (QUADOP_LANE, float_mls_laneq, 0, FP)
-
-  /* Implemented by aarch64_crypto_sha256<op><mode>.  */
-  VAR1 (TERNOPU, crypto_sha256h, 0, DEFAULT, v4si)
-  VAR1 (TERNOPU, crypto_sha256h2, 0, DEFAULT, v4si)
-  VAR1 (BINOPU, crypto_sha256su0, 0, DEFAULT, v4si)
-  VAR1 (TERNOPU, crypto_sha256su1, 0, DEFAULT, v4si)
-
-  /* Implemented by aarch64_crypto_pmull<mode>.  */
+ /* Implemented by aarch64_crypto_pmull<mode>.  */
   VAR1 (BINOPP, crypto_pmull, 0, DEFAULT, di)
   VAR1 (BINOPP, crypto_pmull, 0, DEFAULT, v2di)
 
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index b851f046bcb..89b28778962 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -16723,44 +16723,6 @@ vrsrad_n_u64 (uint64_t __a, uint64_t __b, const int 
__c)
   return __builtin_aarch64_ursra_ndi_uuus (__a, __b, __c);
 }
 
-#pragma GCC push_options
-#pragma GCC target ("+nothing+sha2")
-
-/* vsha1  */
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha256hq_u32 (uint32x4_t __hash_abcd, uint32x4_t __hash_efgh, uint32x4_t __wk)
-{
-  return __builtin_aarch64_crypto_sha256hv4si_uuuu (__hash_abcd, __hash_efgh,
-                                                    __wk);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha256h2q_u32 (uint32x4_t __hash_efgh, uint32x4_t __hash_abcd, uint32x4_t 
__wk)
-{
-  return __builtin_aarch64_crypto_sha256h2v4si_uuuu (__hash_efgh, __hash_abcd,
-                                                     __wk);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha256su0q_u32 (uint32x4_t __w0_3, uint32x4_t __w4_7)
-{
-  return __builtin_aarch64_crypto_sha256su0v4si_uuu (__w0_3, __w4_7);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha256su1q_u32 (uint32x4_t __tw0_3, uint32x4_t __w8_11, uint32x4_t __w12_15)
-{
-  return __builtin_aarch64_crypto_sha256su1v4si_uuuu (__tw0_3, __w8_11,
-                                                      __w12_15);
-}
-
-#pragma GCC pop_options
-
 /* vshl */
 
 __extension__ extern __inline int8x8_t
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vsha256.c 
b/gcc/testsuite/gcc.target/aarch64/neon/vsha256.c
new file mode 100644
index 00000000000..a270e830b6c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vsha256.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vsha256hq_u32:
+** sha256h     q0, q1, v2\.4s
+** ret
+*/
+TEST_UNIFORM_TERNARY (vsha256hq_u32, uint32x4_t)
+
+/*
+** test_vsha256h2q_u32:
+** sha256h2    q0, q1, v2\.4s
+** ret
+*/
+TEST_UNIFORM_TERNARY (vsha256h2q_u32, uint32x4_t)
+
+/*
+** test_vsha256su0q_u32:
+** sha256su0   v0\.4s, v1\.4s
+** ret
+*/
+TEST_UNIFORM_BINARY (vsha256su0q_u32, uint32x4_t)
+
+/*
+** test_vsha256su1q_u32:
+** sha256su1   v0\.4s, v1\.4s, v2\.4s
+** ret
+*/
+TEST_UNIFORM_TERNARY (vsha256su1q_u32, uint32x4_t)
-- 
2.51.0

Reply via email to