From 9277d115a86d642497e710e50976b31cb6f2d0cf Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Fri, 4 Jan 2019 11:18:34 -0500 Subject: Fix SHA ARM64 compile with MSVC compiler (GH #776) --- sha_simd.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'sha_simd.cpp') 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); -- cgit v1.2.1