use __builtin_clz to compute most significant bit set

Started by Joseph Yualmost 3 years ago2 messages
#1Joseph Yu
kiddo831007@gmail.com
1 attachment(s)

hi community

This is the first time for me to submit a patch to Postgres community.

instead of using for loop to find the most significant bit set. we could
use __builtin_clz function to first find the number of leading zeros for
the mask and then we can find the index by 32 - __builtin_clz(mask).

diff --git a/src/port/fls.c b/src/port/fls.c
index 19b4221826..4f4c412732 100644
--- a/src/port/fls.c
+++ b/src/port/fls.c
@@ -54,11 +54,7 @@
 int
 fls(int mask)
 {
- int bit;
-
  if (mask == 0)
  return (0);
- for (bit = 1; mask != 1; bit++)
- mask = (unsigned int) mask >> 1;
- return (bit);
+ return (sizeof(int) << 3) - __builtin_clz(mask);
 }

Best Regards,

Joseph

Attachments:

fls.patchtext/x-patch; charset=US-ASCII; name=fls.patchDownload
diff --git a/src/port/fls.c b/src/port/fls.c
index 19b4221826..4f4c412732 100644
--- a/src/port/fls.c
+++ b/src/port/fls.c
@@ -54,11 +54,7 @@
 int
 fls(int mask)
 {
-	int			bit;
-
 	if (mask == 0)
 		return (0);
-	for (bit = 1; mask != 1; bit++)
-		mask = (unsigned int) mask >> 1;
-	return (bit);
+	return (sizeof(int) << 3) - __builtin_clz(mask);
 }
#2Magnus Hagander
magnus@hagander.net
In reply to: Joseph Yu (#1)
Re: use __builtin_clz to compute most significant bit set

On Sat, Feb 25, 2023 at 9:32 PM Joseph Yu <kiddo831007@gmail.com> wrote:

hi community

This is the first time for me to submit a patch to Postgres community.

instead of using for loop to find the most significant bit set. we could
use __builtin_clz function to first find the number of leading zeros for
the mask and then we can find the index by 32 - __builtin_clz(mask).

Hi!

This file has already been removed, as of 4f1f5a7f85. Which already uses
__builtin_clz if it' available.

Were you perhaps looking at an old version instead of the master branch?

--
Magnus Hagander
Me: https://www.hagander.net/ <http://www.hagander.net/&gt;
Work: https://www.redpill-linpro.com/ <http://www.redpill-linpro.com/&gt;