Fixed error with non-SIMD implementation of memcmpSmall

This commit is contained in:
Alexey Milovidov 2019-07-25 03:28:27 +03:00
parent d414e7366c
commit 6b2810d346

View File

@ -5,13 +5,6 @@
#include <Core/Defines.h> #include <Core/Defines.h>
/// We can process uninitialized memory in the functions below.
/// Results don't depend on the values inside uninitialized memory but Memory Sanitizer cannot see it.
/// Disable optimized functions if compile with Memory Sanitizer.
#if defined(__SSE2__) && !defined(MEMORY_SANITIZER)
#include <emmintrin.h>
namespace detail namespace detail
{ {
@ -28,6 +21,15 @@ inline int cmp(T a, T b)
} }
/// We can process uninitialized memory in the functions below.
/// Results don't depend on the values inside uninitialized memory but Memory Sanitizer cannot see it.
/// Disable optimized functions if compile with Memory Sanitizer.
#if defined(__SSE2__) && !defined(MEMORY_SANITIZER)
#include <emmintrin.h>
/** All functions works under the following assumptions: /** All functions works under the following assumptions:
* - it's possible to read up to 15 excessive bytes after end of 'a' and 'b' region; * - it's possible to read up to 15 excessive bytes after end of 'a' and 'b' region;
* - memory regions are relatively small and extra loop unrolling is not worth to do. * - memory regions are relatively small and extra loop unrolling is not worth to do.
@ -198,7 +200,10 @@ inline bool memoryIsZeroSmallAllowOverflow15(const void * data, size_t size)
template <typename Char> template <typename Char>
inline int memcmpSmallAllowOverflow15(const Char * a, size_t a_size, const Char * b, size_t b_size) inline int memcmpSmallAllowOverflow15(const Char * a, size_t a_size, const Char * b, size_t b_size)
{ {
return memcmp(a, b, std::min(a_size, b_size)); if (auto res = memcmp(a, b, std::min(a_size, b_size)))
return res;
else
return detail::cmp(a_size, b_size);
} }
template <typename Char> template <typename Char>