static inline void chunkmemset_16(uint8_t *from, chunk_t *chunk) {
/* See explanation in chunkset_avx512.c */
-#if defined(_MSC_VER) && _MSC_VER <= 1900
+#if defined(_MSC_VER) && _MSC_VER < 1920
halfchunk_t half = _mm_loadu_si128((__m128i*)from);
*chunk = _mm256_inserti128_si256(_mm256_castsi128_si256(half), half, 1);
#else
}
static inline void chunkmemset_16(uint8_t *from, chunk_t *chunk) {
- /* Unfortunately there seems to be a compiler bug in Visual Studio 2015 where
+ /* Unfortunately there seems to be a compiler bug in Visual Studio 2015/2017 where
* the load is dumped to the stack with an aligned move for this memory-register
- * broadcast. The vbroadcasti128 instruction is 2 fewer cycles and this dump to
- * stack doesn't exist if compiled with optimizations. For the sake of working
+ * broadcast, and the stack isn't 16-byte aligned on i386 in debug builds.
+ * The vbroadcasti128 instruction is 2 fewer cycles and this dump to stack
+ * doesn't exist if compiled with optimizations. For the sake of working
* properly in a debugger, let's take the 2 cycle penalty */
-#if defined(_MSC_VER) && _MSC_VER <= 1900
+#if defined(_MSC_VER) && _MSC_VER < 1920
halfchunk_t half = _mm_loadu_si128((__m128i*)from);
*chunk = _mm256_inserti128_si256(_mm256_castsi128_si256(half), half, 1);
#else