From 2d0e388d9ad348d1b9ca15e4e3ef63526d4c16a1 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sun, 18 Sep 2016 11:45:12 -0400 Subject: [PATCH] Fix SunCC 12.5 failed validation in gcm.cpp (Issue 284) --- gcm.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gcm.cpp b/gcm.cpp index e3e40466..75e43375 100644 --- a/gcm.cpp +++ b/gcm.cpp @@ -94,14 +94,18 @@ __m128i _mm_clmulepi64_si128(const __m128i &a, const __m128i &b, int i) #if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE || CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE inline static void SSE2_Xor16(byte *a, const byte *b, const byte *c) { -#if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE && !defined(__SUNPRO_CC) +// SunCC 5.14 crash (bewildering since asserts are not in effect in rlease builds) +// Also see http://github.com/weidai11/cryptopp/issues/226 +# if __SUNPRO_CC + *(__m128i *)(void *)a = _mm_xor_si128(*(__m128i *)(void *)b, *(__m128i *)(void *)c); +# elif CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE CRYPTOPP_ASSERT(IsAlignedOn(a,GetAlignmentOf<__m128i>())); CRYPTOPP_ASSERT(IsAlignedOn(b,GetAlignmentOf<__m128i>())); CRYPTOPP_ASSERT(IsAlignedOn(c,GetAlignmentOf<__m128i>())); *(__m128i *)(void *)a = _mm_xor_si128(*(__m128i *)(void *)b, *(__m128i *)(void *)c); -#else +# else asm ("movdqa %1, %%xmm0; pxor %2, %%xmm0; movdqa %%xmm0, %0;" : "=m" (a[0]) : "m"(b[0]), "m"(c[0])); -#endif +# endif } #endif