prefetch instructions in FindMatchLength

This commit is contained in:
Yoqie 2021-07-04 23:54:46 +03:00 committed by GitHub
parent b638ebe5d9
commit 05654655af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 1 deletions

View File

@ -103,7 +103,21 @@ static inline std::pair<size_t, bool> FindMatchLength(const char* s1,
uint64_t* data) {
assert(s2_limit >= s2);
size_t matched = 0;
#if defined(__has_builtin)
#if __has_builtin(__builtin_prefetch)
__builtin_prefetch(s1);
__builtin_prefetch(s2);
#endif
#elif defined(__SSE__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1))
#include <xmmintrin.h>
_mm_prefetch(s1, _MM_HINT_T1);
_mm_prefetch(s2, _MM_HINT_T1);
#elif defined(_M_ARM64) || defined(_M_ARM)
__prefetch(s1);
__prefetch(s2);
#endif
// This block isn't necessary for correctness; we could just start looping
// immediately. As an optimization though, it is useful. It creates some not
// uncommon code paths that determine, without extra effort, whether the match