From 1dcdefa8b3a69a8bd008aba276c180f28f7ceca3 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Sun, 13 May 2018 00:36:01 +0100 Subject: [PATCH] quic: Use __builtin_clz if available Different processors has specific instructions to count leading zero bits. This includes: x86. x64, arm, ppc. For portability reason the behaviour of __builtin_clz is not defined if the value is zero so test for it. Currently the function is not called with the value or 0. This increase performance decoding of about 4-5% on a x64 machine (code size decreases a little too, but about 0.1%). Signed-off-by: Frediano Ziglio Acked-by: Christophe Fergeau --- common/quic.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/common/quic.c b/common/quic.c index c0ef5e8..90aac85 100644 --- a/common/quic.c +++ b/common/quic.c @@ -280,6 +280,12 @@ static const BYTE lzeroes[256] = { /* count leading zeroes */ static unsigned int cnt_l_zeroes(const unsigned int bits) { + if (spice_extra_checks) { + spice_assert(bits != 0); + } +#if defined(__GNUC__) && __GNUC__ >= 4 + return __builtin_clz(bits); +#else if (bits & 0xff800000) { return lzeroes[bits >> 24]; } else if (bits & 0xffff8000) { @@ -289,6 +295,7 @@ static unsigned int cnt_l_zeroes(const unsigned int bits) } else { return 24 + lzeroes[bits & 0x000000ff]; } +#endif } #define QUIC_FAMILY_8BPC