From b70bc4865f559db45adaabdc1aabc72c02e92de8 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Thu, 3 Jan 2019 13:37:53 -0500 Subject: [PATCH] Fix ChaCha NEON compile with MSVC compiler (GH #776) --- chacha_simd.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/chacha_simd.cpp b/chacha_simd.cpp index 534445a6..b7d9c0a9 100644 --- a/chacha_simd.cpp +++ b/chacha_simd.cpp @@ -70,6 +70,15 @@ ANONYMOUS_NAMESPACE_BEGIN // ***************************** NEON ***************************** // +// Thanks to Peter Cordes, https://stackoverflow.com/q/54016821/608639 +#if (CRYPTOPP_ARM_NEON_AVAILABLE) +# 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 // Microsoft workaround + #if (CRYPTOPP_ARM_NEON_AVAILABLE) template @@ -303,7 +312,9 @@ void ChaCha_OperateKeystream_NEON(const word32 *state, const byte* input, byte * const uint32x4_t state3 = vld1q_u32(state + 3*4); const uint32x4_t CTRS[3] = { - {1,0,0,0}, {2,0,0,0}, {3,0,0,0} + PACK32x4(1,0,0,0), + PACK32x4(2,0,0,0), + PACK32x4(3,0,0,0) }; uint32x4_t r0_0 = state0;