From a8d1105d90ce4d1e04626d7680f7338f04704c14 Mon Sep 17 00:00:00 2001 From: Andrew Pogrebnoi Date: Fri, 5 Dec 2025 10:45:52 +0200 Subject: [PATCH] Optimize pg_popcount32/64_slow() lookups This commit makes lookups into pg_number_of_ones[] branchless. Which optimizes the slow-path of words' popcount. --- contrib/pg_tde/src/libkmip | 1 + src/port/pg_bitutils.c | 30 ++++++++++++------------------ 2 files changed, 13 insertions(+), 18 deletions(-) create mode 160000 contrib/pg_tde/src/libkmip diff --git a/contrib/pg_tde/src/libkmip b/contrib/pg_tde/src/libkmip new file mode 160000 index 00000000000..f3f21ceb32b --- /dev/null +++ b/contrib/pg_tde/src/libkmip @@ -0,0 +1 @@ +Subproject commit f3f21ceb32bef8ce8fb36e25c6ae4831f7689e02 diff --git a/src/port/pg_bitutils.c b/src/port/pg_bitutils.c index 5677525693d..4c482c5f218 100644 --- a/src/port/pg_bitutils.c +++ b/src/port/pg_bitutils.c @@ -350,15 +350,10 @@ pg_popcount32_slow(uint32 word) #ifdef HAVE__BUILTIN_POPCOUNT return __builtin_popcount(word); #else /* !HAVE__BUILTIN_POPCOUNT */ - int result = 0; - - while (word != 0) - { - result += pg_number_of_ones[word & 255]; - word >>= 8; - } - - return result; + return pg_number_of_ones[word >> 24] + + pg_number_of_ones[(word >> 16) & 0xFF] + + pg_number_of_ones[(word >> 8) & 0xFF] + + pg_number_of_ones[word & 0xFF]; #endif /* HAVE__BUILTIN_POPCOUNT */ } @@ -378,15 +373,14 @@ pg_popcount64_slow(uint64 word) #error "cannot find integer of the same size as uint64_t" #endif #else /* !HAVE__BUILTIN_POPCOUNT */ - int result = 0; - - while (word != 0) - { - result += pg_number_of_ones[word & 255]; - word >>= 8; - } - - return result; + return pg_number_of_ones[word >> 56] + + pg_number_of_ones[(word >> 48) & 0xFF] + + pg_number_of_ones[(word >> 40) & 0xFF] + + pg_number_of_ones[(word >> 32) & 0xFF] + + pg_number_of_ones[(word >> 24) & 0xFF] + + pg_number_of_ones[(word >> 16) & 0xFF] + + pg_number_of_ones[(word >> 8) & 0xFF] + + pg_number_of_ones[word >> 0 & 0xFF]; #endif /* HAVE__BUILTIN_POPCOUNT */ } -- 2.43.0