summaryrefslogtreecommitdiff
path: root/sha_simd.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2019-01-04 11:18:34 -0500
committerJeffrey Walton <noloader@gmail.com>2019-01-04 11:18:34 -0500
commit9277d115a86d642497e710e50976b31cb6f2d0cf (patch)
tree435b99563684937c3acc0526c272c10085e8bcaa /sha_simd.cpp
parent5ccbd9af6a7c999e474d5a834360098f2e0440a5 (diff)
downloadcryptopp-git-9277d115a86d642497e710e50976b31cb6f2d0cf.tar.gz
Fix SHA ARM64 compile with MSVC compiler (GH #776)
Diffstat (limited to 'sha_simd.cpp')
-rw-r--r--sha_simd.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/sha_simd.cpp b/sha_simd.cpp
index 95ac10fc..3fd9df72 100644
--- a/sha_simd.cpp
+++ b/sha_simd.cpp
@@ -45,6 +45,17 @@
# define EXCEPTION_EXECUTE_HANDLER 1
#endif
+// Thanks to Peter Cordes, https://stackoverflow.com/q/54016821/608639
+#if (CRYPTOPP_ARM_NEON_AVAILABLE)
+# ifndef PACK32x4
+# if defined(_MSC_VER)
+# define PACK32x4(w,x,y,z) { ((w) + (word64(x) << 32)), ((y) + (word64(z) << 32)) }
+# else
+# define PACK32x4(w,x,y,z) { (w), (x), (y), (z) }
+# endif
+# endif // PACK32x4
+#endif // Microsoft workaround
+
// Clang __m128i casts
#define M128_CAST(x) ((__m128i *)(void *)(x))
#define CONST_M128_CAST(x) ((const __m128i *)(const void *)(x))
@@ -83,7 +94,9 @@ bool CPU_ProbeSHA1()
volatile bool result = true;
__try
{
- uint32x4_t data1 = {1,2,3,4}, data2 = {5,6,7,8}, data3 = {9,10,11,12};
+ uint32x4_t data1 = PACK32x4(1,2,3,4);
+ uint32x4_t data2 = PACK32x4(5,6,7,8);
+ uint32x4_t data3 = PACK32x4(9,10,11,12);
uint32x4_t r1 = vsha1cq_u32 (data1, 0, data2);
uint32x4_t r2 = vsha1mq_u32 (data1, 0, data2);
@@ -145,7 +158,9 @@ bool CPU_ProbeSHA2()
volatile bool result = true;
__try
{
- uint32x4_t data1 = {1,2,3,4}, data2 = {5,6,7,8}, data3 = {9,10,11,12};
+ uint32x4_t data1 = PACK32x4(1,2,3,4);
+ uint32x4_t data2 = PACK32x4(5,6,7,8);
+ uint32x4_t data3 = PACK32x4(9,10,11,12);
uint32x4_t r1 = vsha256hq_u32 (data1, data2, data3);
uint32x4_t r2 = vsha256h2q_u32 (data1, data2, data3);