diff options
author | Richard Braun <rbraun@sceen.net> | 2014-12-10 23:16:18 +0100 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2014-12-10 23:16:18 +0100 |
commit | 610c802c865a2d467a39c700e978c5644e4ea3ca (patch) | |
tree | fc6eafb681acc1411f0b10cff37ccdbd68f0b787 | |
parent | 48361587af2ddbd92cb84c0465bd797be65436e7 (diff) |
kern/log2: new module
-rw-r--r-- | Makefrag.am | 1 | ||||
-rw-r--r-- | kern/log2.h | 45 |
2 files changed, 46 insertions, 0 deletions
diff --git a/Makefrag.am b/Makefrag.am index 4ae58796..5d071795 100644 --- a/Makefrag.am +++ b/Makefrag.am @@ -25,6 +25,7 @@ x15_SOURCES += \ kern/llsync.c \ kern/llsync.h \ kern/llsync_i.h \ + kern/log2.h \ kern/macros.h \ kern/mutex.c \ kern/mutex.h \ diff --git a/kern/log2.h b/kern/log2.h new file mode 100644 index 00000000..c9cc5be1 --- /dev/null +++ b/kern/log2.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014 Richard Braun. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * + * Integer base 2 logarithm operations. + */ + +#ifndef _KERN_LOG2_H +#define _KERN_LOG2_H + +#include <kern/assert.h> +#include <kern/limits.h> + +static inline unsigned int +ilog2(unsigned long x) +{ + assert(x != 0); + return LONG_BIT - __builtin_clzl(x) - 1; +} + +static inline unsigned int +iorder2(unsigned long size) +{ + assert(size != 0); + + if (size == 1) + return 0; + + return ilog2(size - 1) + 1; +} + +#endif /* _KERN_LOG2_H */ |