From b721db98e53fa1cc6976988a0ef3f4cff1b48f1c Mon Sep 17 00:00:00 2001 From: Jun He Date: Tue, 6 Aug 2019 15:58:46 +0800 Subject: [PATCH] igzip: optimize convert_dist_to_dist_sym to branchless convert_dist_to_dist_sym uses long if/else branch to get look back distance. The distance calculation is well formed for each distance range, so it could be optimized for a branchless version. Change-Id: I4e1e5170f8b3238631f3048087f95acc53e4498e Signed-off-by: Jun He --- igzip/huff_codes.c | 39 ++++++--------------------------------- 1 file changed, 6 insertions(+), 33 deletions(-) diff --git a/igzip/huff_codes.c b/igzip/huff_codes.c index cca3907..7512af2 100644 --- a/igzip/huff_codes.c +++ b/igzip/huff_codes.c @@ -728,39 +728,12 @@ void isal_update_histogram_base(uint8_t * start_stream, int length, static uint32_t convert_dist_to_dist_sym(uint32_t dist) { assert(dist <= 32768 && dist > 0); - if (dist <= 2) - return dist - 1; - else if (dist <= 4) - return 0 + (dist - 1) / 1; - else if (dist <= 8) - return 2 + (dist - 1) / 2; - else if (dist <= 16) - return 4 + (dist - 1) / 4; - else if (dist <= 32) - return 6 + (dist - 1) / 8; - else if (dist <= 64) - return 8 + (dist - 1) / 16; - else if (dist <= 128) - return 10 + (dist - 1) / 32; - else if (dist <= 256) - return 12 + (dist - 1) / 64; - else if (dist <= 512) - return 14 + (dist - 1) / 128; - else if (dist <= 1024) - return 16 + (dist - 1) / 256; - else if (dist <= 2048) - return 18 + (dist - 1) / 512; - else if (dist <= 4096) - return 20 + (dist - 1) / 1024; - else if (dist <= 8192) - return 22 + (dist - 1) / 2048; - else if (dist <= 16384) - return 24 + (dist - 1) / 4096; - else if (dist <= 32768) - return 26 + (dist - 1) / 8192; - else - return ~0; /* ~0 is an invalid distance code */ - + if (dist <= 32768) { + uint32_t msb = dist > 4 ? bsr(dist - 1) - 2 : 0; + return (msb * 2) + ((dist - 1) >> msb); + } else { + return ~0; + } } /**