From 1cb906938dbe3efbbe49f3264a142ce1f21cec76 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sat, 16 Jul 2016 23:45:16 -0400 Subject: [PATCH] Fix SunCC 12.2 and 12.3 failed compile in rijndael.cpp due to std::swap(__m128i, __m128i) --- rijndael.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rijndael.cpp b/rijndael.cpp index 0546c2a9..9139c227 100644 --- a/rijndael.cpp +++ b/rijndael.cpp @@ -274,8 +274,15 @@ void Rijndael::Base::UncheckedSetKey(const byte *userKey, unsigned int keylen, c rk = m_key; unsigned int i, j; +#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x5120) + // __m128i is an unsigned long long[2], and support for swapping it was not formally added until C++11. + // SunCC 12.1 - 12.3 fail to consume the swap; while SunCC 12.4 consumes it without -std=c++11. + __m128i t = *(__m128i *)(rk); + *(__m128i *)(rk) = *(__m128i *)(rk+4*m_rounds); + *(__m128i *)(rk+4*m_rounds) = t; +#else std::swap(*(__m128i *)(void *)(rk), *(__m128i *)(void *)(rk+4*m_rounds)); - +#endif for (i = 4, j = 4*m_rounds-4; i < j; i += 4, j -= 4) { temp = _mm_aesimc_si128(*(__m128i *)(void *)(rk+i));