diff options
author | Snappy Team <no-reply@google.com> | 2022-04-27 15:16:35 +0000 |
---|---|---|
committer | Victor Costan <pwnall@chromium.org> | 2022-05-09 16:19:11 +0000 |
commit | 6a2b78a379e4a6ca11eaacb3e26bea397a46d74b (patch) | |
tree | 923f7fcc3a1a89d1c77131d67e51d2ca18c546e6 | |
parent | 8dd58a519f79f0742d4c68fbccb2aed2ddb651e8 (diff) | |
download | snappy-git-6a2b78a379e4a6ca11eaacb3e26bea397a46d74b.tar.gz |
Optimize Zippy compression for ARM by 5-10% by choosing csel instructions
PiperOrigin-RevId: 444863689
-rw-r--r-- | snappy-internal.h | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/snappy-internal.h b/snappy-internal.h index ae7ab5a..e552ea0 100644 --- a/snappy-internal.h +++ b/snappy-internal.h @@ -230,8 +230,9 @@ static inline std::pair<size_t, bool> FindMatchLength(const char* s1, uint64_t xorval = a1 ^ a2; int shift = Bits::FindLSBSetNonZero64(xorval); size_t matched_bytes = shift >> 3; + uint64_t a3 = UNALIGNED_LOAD64(s2 + 4); #ifndef __x86_64__ - *data = UNALIGNED_LOAD64(s2 + matched_bytes); + a2 = static_cast<uint32_t>(xorval) == 0 ? a3 : a2; #else // Ideally this would just be // @@ -242,13 +243,12 @@ static inline std::pair<size_t, bool> FindMatchLength(const char* s1, // use a conditional move (it's tuned to cut data dependencies). In this // case there is a longer parallel chain anyway AND this will be fairly // unpredictable. - uint64_t a3 = UNALIGNED_LOAD64(s2 + 4); asm("testl %k2, %k2\n\t" "cmovzq %1, %0\n\t" : "+r"(a2) : "r"(a3), "r"(xorval)); - *data = a2 >> (shift & (3 * 8)); #endif + *data = a2 >> (shift & (3 * 8)); return std::pair<size_t, bool>(matched_bytes, true); } else { matched = 8; @@ -270,16 +270,16 @@ static inline std::pair<size_t, bool> FindMatchLength(const char* s1, uint64_t xorval = a1 ^ a2; int shift = Bits::FindLSBSetNonZero64(xorval); size_t matched_bytes = shift >> 3; + uint64_t a3 = UNALIGNED_LOAD64(s2 + 4); #ifndef __x86_64__ - *data = UNALIGNED_LOAD64(s2 + matched_bytes); + a2 = static_cast<uint32_t>(xorval) == 0 ? a3 : a2; #else - uint64_t a3 = UNALIGNED_LOAD64(s2 + 4); asm("testl %k2, %k2\n\t" "cmovzq %1, %0\n\t" : "+r"(a2) : "r"(a3), "r"(xorval)); - *data = a2 >> (shift & (3 * 8)); #endif + *data = a2 >> (shift & (3 * 8)); matched += matched_bytes; assert(matched >= 8); return std::pair<size_t, bool>(matched, false); |