Port the SHA1 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 (vsha1cq,
        vsha1mq, vsha1pq, vsha1h, vsha1su0q, vsha1su1q): New function
        declarations.
        * config/aarch64/aarch64-simd-builtins.def: Delete builtin
        functions.
        * config/aarch64/arm_neon.h (vsha1cq_u32, vsha1mq_u32,
        vsha1pq_u32, vsha1h_u32, vsha1su0q_u32, vsha1su1q_u32): Delete
        function definitions

gcc/testsuite/ChangeLog:

        * gcc.target/aarch64/neon/vsha1.c: New test.
        * gcc.target/aarch64/neon/arm_neon_test.h: Set `+sha2` target
        flag.
---
 .../aarch64/aarch64-neon-builtins-base.cc     |  8 +++
 .../aarch64/aarch64-neon-builtins-base.def    | 10 ++++
 gcc/config/aarch64/aarch64-simd-builtins.def  |  8 ---
 gcc/config/aarch64/arm_neon.h                 | 42 ---------------
 .../gcc.target/aarch64/neon/arm_neon_test.h   |  2 +-
 gcc/testsuite/gcc.target/aarch64/neon/vsha1.c | 51 +++++++++++++++++++
 6 files changed, 70 insertions(+), 51 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vsha1.c

diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc 
b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
index 1bf4bf33d41..ef128d0de1d 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
@@ -797,4 +797,12 @@ NEON_FUNCTION (vaeseq,   
gimple_exact_insn<CODE_FOR_aarch64_crypto_aesev16qi>,)
 NEON_FUNCTION (vaesdq,   gimple_exact_insn<CODE_FOR_aarch64_crypto_aesdv16qi>,)
 NEON_FUNCTION (vaesmcq,  
gimple_exact_insn<CODE_FOR_aarch64_crypto_aesmcv16qi>,)
 NEON_FUNCTION (vaesimcq, 
gimple_exact_insn<CODE_FOR_aarch64_crypto_aesimcv16qi>,)
+
+// SHA1
+NEON_FUNCTION (vsha1cq,   
gimple_exact_insn<CODE_FOR_aarch64_crypto_sha1cv4si>,)
+NEON_FUNCTION (vsha1mq,   
gimple_exact_insn<CODE_FOR_aarch64_crypto_sha1mv4si>,)
+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>,)
 }
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def 
b/gcc/config/aarch64/aarch64-neon-builtins-base.def
index 57d4aa6dfff..b0cc6d1ce92 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.def
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def
@@ -153,3 +153,13 @@ DEF_NEON_FUNCTION (vaesdq,   b_unsigned, ("Q0,Q0,Q0"))
 DEF_NEON_FUNCTION (vaesmcq,  b_unsigned, ("Q0,Q0"))
 DEF_NEON_FUNCTION (vaesimcq, b_unsigned, ("Q0,Q0"))
 #undef REQUIRED_EXTENSIONS
+
+// SHA1
+#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD | 
AARCH64_FL_SHA2)
+DEF_NEON_FUNCTION (vsha1cq,   s_unsigned, ("Q0,Q0,s0,Q0"))
+DEF_NEON_FUNCTION (vsha1mq,   s_unsigned, ("Q0,Q0,s0,Q0"))
+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
\ 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 5ee19ba0cd0..11d418a68a4 100644
--- a/gcc/config/aarch64/aarch64-simd-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-builtins.def
@@ -712,14 +712,6 @@
   BUILTIN_VDQSF (QUADOP_LANE, float_mla_laneq, 0, FP)
   BUILTIN_VDQSF (QUADOP_LANE, float_mls_laneq, 0, FP)
 
-  /* Implemented by aarch64_crypto_sha1<op><mode>.  */
-  VAR1 (UNOPU, crypto_sha1h, 0, DEFAULT, si)
-  VAR1 (BINOPU, crypto_sha1su1, 0, DEFAULT, v4si)
-  VAR1 (TERNOPU, crypto_sha1c, 0, DEFAULT, v4si)
-  VAR1 (TERNOPU, crypto_sha1m, 0, DEFAULT, v4si)
-  VAR1 (TERNOPU, crypto_sha1p, 0, DEFAULT, v4si)
-  VAR1 (TERNOPU, crypto_sha1su0, 0, DEFAULT, v4si)
-
   /* Implemented by aarch64_crypto_sha256<op><mode>.  */
   VAR1 (TERNOPU, crypto_sha256h, 0, DEFAULT, v4si)
   VAR1 (TERNOPU, crypto_sha256h2, 0, DEFAULT, v4si)
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index 38e33eef813..b851f046bcb 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -16728,48 +16728,6 @@ vrsrad_n_u64 (uint64_t __a, uint64_t __b, const int 
__c)
 
 /* vsha1  */
 
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha1cq_u32 (uint32x4_t __hash_abcd, uint32_t __hash_e, uint32x4_t __wk)
-{
-  return __builtin_aarch64_crypto_sha1cv4si_uuuu (__hash_abcd, __hash_e, __wk);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha1mq_u32 (uint32x4_t __hash_abcd, uint32_t __hash_e, uint32x4_t __wk)
-{
-  return __builtin_aarch64_crypto_sha1mv4si_uuuu (__hash_abcd, __hash_e, __wk);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha1pq_u32 (uint32x4_t __hash_abcd, uint32_t __hash_e, uint32x4_t __wk)
-{
-  return __builtin_aarch64_crypto_sha1pv4si_uuuu (__hash_abcd, __hash_e, __wk);
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha1h_u32 (uint32_t __hash_e)
-{
-  return __builtin_aarch64_crypto_sha1hsi_uu (__hash_e);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha1su0q_u32 (uint32x4_t __w0_3, uint32x4_t __w4_7, uint32x4_t __w8_11)
-{
-  return __builtin_aarch64_crypto_sha1su0v4si_uuuu (__w0_3, __w4_7, __w8_11);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vsha1su1q_u32 (uint32x4_t __tw0_3, uint32x4_t __w12_15)
-{
-  return __builtin_aarch64_crypto_sha1su1v4si_uuu (__tw0_3, __w12_15);
-}
-
 __extension__ extern __inline uint32x4_t
 __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
 vsha256hq_u32 (uint32x4_t __hash_abcd, uint32x4_t __hash_efgh, uint32x4_t __wk)
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/arm_neon_test.h 
b/gcc/testsuite/gcc.target/aarch64/neon/arm_neon_test.h
index 856e1a08190..413c4021058 100644
--- a/gcc/testsuite/gcc.target/aarch64/neon/arm_neon_test.h
+++ b/gcc/testsuite/gcc.target/aarch64/neon/arm_neon_test.h
@@ -1,6 +1,6 @@
 #include "arm_neon.h"
 
-#pragma GCC target "+simd+fp16+bf16+sha3+aes"
+#pragma GCC target "+simd+fp16+bf16+sha2+sha3+aes"
 
 #define VEC_LEN(VEC) (sizeof (VEC) / sizeof (VEC[0]))
 
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vsha1.c 
b/gcc/testsuite/gcc.target/aarch64/neon/vsha1.c
new file mode 100644
index 00000000000..a7d299feb36
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vsha1.c
@@ -0,0 +1,51 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vsha1cq_u32:
+** fmov        s([0-9]+), w0
+** sha1c       q0, s\1, v1\.4s
+** ret
+*/
+TEST_TERNARY (vsha1cq_u32, uint32x4_t, uint32x4_t, uint32_t, uint32x4_t)
+
+/*
+** test_vsha1mq_u32:
+** fmov        s([0-9]+), w0
+** sha1m       q0, s\1, v1\.4s
+** ret
+*/
+TEST_TERNARY (vsha1mq_u32, uint32x4_t, uint32x4_t, uint32_t, uint32x4_t)
+
+/*
+** test_vsha1pq_u32:
+** fmov        s([0-9]+), w0
+** sha1p       q0, s\1, v1\.4s
+** ret
+*/
+TEST_TERNARY (vsha1pq_u32, uint32x4_t, uint32x4_t, uint32_t, uint32x4_t)
+
+/*
+** test_vsha1h_u32:
+** fmov        s([0-9]+), w0
+** sha1h       s\1, s\1
+** fmov        w0, s\1
+** ret
+*/
+TEST_UNARY (vsha1h_u32, uint32_t, uint32_t)
+
+/*
+** test_vsha1su0q_u32:
+** sha1su0     v0\.4s, v1\.4s, v2\.4s
+** ret
+*/
+TEST_UNIFORM_TERNARY (vsha1su0q_u32, uint32x4_t)
+
+/*
+** test_vsha1su1q_u32:
+** sha1su1     v0\.4s, v1\.4s
+** ret
+*/
+TEST_UNIFORM_BINARY (vsha1su1q_u32, uint32x4_t)
-- 
2.51.0

Reply via email to