Skip to content

Commit

Permalink
Fix global optimization bug for ChaCha AVX2 under VS2017 (GH #735)
Browse files Browse the repository at this point in the history
Also see #649. The 649 issue is the one affecting AES. It appears to be the same problem.
  • Loading branch information
noloader committed Nov 9, 2018
1 parent af9fb9d commit 092309b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 6 deletions.
21 changes: 18 additions & 3 deletions chacha-avx.cpp
Expand Up @@ -36,10 +36,21 @@ extern const char CHACHA_AVX_FNAME[] = __FILE__;
# define MAYBE_CONST const
#endif

#if (CRYPTOPP_AVX2_AVAILABLE)
// VS2017 and global optimization bug. TODO, figure out when
// we can re-enable full optimizations for VS2017. Also see
// https://github.com/weidai11/cryptopp/issues/649 and
// https://github.com/weidai11/cryptopp/issues/735. The
// 649 issue affects AES but it is the same here. The 735
// issue is ChaCha AVX2 cut-in where it surfaced again.
#if (_MSC_VER >= 1910) && defined(NDEBUG)
# pragma optimize("", off)
# pragma optimize("ts", on)
#endif

ANONYMOUS_NAMESPACE_BEGIN

#if (CRYPTOPP_AVX2_AVAILABLE)

template <unsigned int R>
inline __m256i RotateLeft(const __m256i val)
{
Expand All @@ -62,10 +73,14 @@ inline __m256i RotateLeft<16>(const __m256i val)
return _mm256_shuffle_epi8(val, mask);
}

#endif CRYPTOPP_AVX2_AVAILABLE

ANONYMOUS_NAMESPACE_END

NAMESPACE_BEGIN(CryptoPP)

#if (CRYPTOPP_AVX2_AVAILABLE)

void ChaCha_OperateKeystream_AVX2(const word32 *state, const byte* input, byte *output, unsigned int rounds)
{
MAYBE_CONST __m128i* state_mm = (MAYBE_CONST __m128i*)(state);
Expand Down Expand Up @@ -358,6 +373,6 @@ void ChaCha_OperateKeystream_AVX2(const word32 *state, const byte* input, byte *
}
}

NAMESPACE_END

#endif // CRYPTOPP_AVX2_AVAILABLE

NAMESPACE_END
6 changes: 3 additions & 3 deletions rijndael.cpp
Expand Up @@ -88,10 +88,10 @@ being unloaded from L1 cache, until that round is finished.
#include "misc.h"
#include "cpu.h"

// MSVC bug, still don't know how to fix it. TODO, figure out
// when we can re-enable optimizations for MSVC. Also see
// VS2017 and global optimization bug. TODO, figure out when
// we can re-enable full optimizations for VS2017. Also see
// https://github.com/weidai11/cryptopp/issues/649
#if defined(_MSC_VER) && (_MSC_VER >= 1910)
#if (_MSC_VER >= 1910) && defined(NDEBUG)
# pragma optimize("", off)
# pragma optimize("ts", on)
#endif
Expand Down

0 comments on commit 092309b

Please sign in to comment.