PERFORCE change 137066 for review
Randall R. Stewart
rrs at FreeBSD.org
Fri Mar 7 09:17:19 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=137066
Change 137066 by rrs at rrs-mips2-jnpr on 2008/03/07 09:17:12
Changing to a table driven lookup seems to improve
performance on interrupts a bit. I also add
a fls64() as well.
Affected files ...
.. //depot/projects/mips2-jnpr/src/sys/libkern/fls.c#2 edit
Differences ...
==== //depot/projects/mips2-jnpr/src/sys/libkern/fls.c#2 (text+ko) ====
@@ -35,14 +35,84 @@
/*
* Find Last Set bit
*/
+
+uint8_t fls_mask[256] = {
+ 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08
+};
+
int
-fls(int mask)
+fls(int m)
{
- int bit;
+ int val;
+ register uint32_t mask = m;
+ if (mask < 0x00000100) {
+ val = mask & 0x000000ff;
+ return (fls_mask[val]);
+ }
+ if (mask > 0x00ffffff) {
+ val = (mask >> 24) & 0x000000ff;
+ return (fls_mask[val] + 24);
+ }
+ if (mask > 0x0000ffff) {
+ val = (mask >> 16) & 0x000000ff;
+ return (fls_mask[val] + 16);
+ }
+ val = (mask >> 8) & 0x000000ff;
+ return (fls_mask[val] + 8);
+}
- if (mask == 0)
- return (0);
- for (bit = 1; mask != 1; bit++)
- mask = (unsigned int)mask >> 1;
- return (bit);
+int
+fls64(uint64_t mask)
+{
+ int val;
+ if(mask <= 0x00000000ffffffff) {
+ val = mask & 0x00000000ffffffff;
+ return(fls(val));
+ }
+ if(mask > 0x00ffffffffffffff) {
+ val = (mask >> 56) & 0x000000ff;
+ return (fls_mask[val] + 56);
+ }
+ if (mask > 0x0000ffffffffffff) {
+ val = (mask >> 48) & 0x000000ff;
+ return (fls_mask[val] + 48);
+ }
+ if (mask > 0x000000ffffffffff) {
+ val = (mask >> 40) & 0x000000ff;
+ return (fls_mask[val] + 40);
+ }
+ val = (mask >> 32) & 0x000000ff;
+ return (fls_mask[val] + 32);
}
+
More information about the p4-projects
mailing list