]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
IMPORT: ebtree: make string_equal_bits turn back to unsigned char
authorWilly Tarreau <w@1wt.eu>
Sat, 30 Dec 2023 15:28:05 +0000 (16:28 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 6 Jan 2024 12:35:42 +0000 (13:35 +0100)
With flsnz() instead of flsnz_long() we're now getting a better
performance on both x86 and ARM. The difference is that previously
we were relying on a function that was forcing the use of register
%eax for the 8-bit version and that was preventing the compiler
from keeping the code optimized. The gain is roughly 5% on ARM and
1% on x86.

This is cbtree commit 19cf39b2514bea79fed94d85e421e293be097a0e.
This is ebtree commit a9aaf2d94e2c92fa37aa3152c2ad8220a9533ead.

include/import/ebtree.h

index 25eb85cfbeb554d65b0af2bb0d3d905766f8bc10..c7a9a3897aaeab4470b7ee6f01ab634c5684b682 100644 (file)
@@ -840,7 +840,7 @@ static forceinline ssize_t string_equal_bits(const unsigned char *a,
                                             const unsigned char *b,
                                             size_t ignore)
 {
-       unsigned long c, d;
+       unsigned char c, d;
        size_t beg;
 
        beg = ignore >> 3;
@@ -864,7 +864,7 @@ static forceinline ssize_t string_equal_bits(const unsigned char *a,
         * identical bits. Note that low bit numbers are assigned to high positions
         * in the byte, as we compare them as strings.
         */
-       return (beg << 3) - flsnz_long(c);
+       return (beg << 3) - flsnz(c);
 }
 
 static forceinline int cmp_bits(const unsigned char *a, const unsigned char *b, unsigned int pos)