Unify instances of integer log2
authorH. Peter Anvin <hpa@linux.intel.com>
Wed, 9 Jun 2010 18:21:52 +0000 (11:21 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Wed, 9 Jun 2010 18:26:22 +0000 (11:26 -0700)
Unify multiple open-coded instances of integer binary logarithm.

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
com32/include/ilog2.h [new file with mode: 0644]
com32/lib/sys/vesa/background.c
com32/lib/sys/vesa/screencpy.c
core/fs/fat/fat.c

diff --git a/com32/include/ilog2.h b/com32/include/ilog2.h
new file mode 100644 (file)
index 0000000..91a5057
--- /dev/null
@@ -0,0 +1,48 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2010 Intel Corporation; author: H. Peter Anvin
+ *
+ *   Permission is hereby granted, free of charge, to any person
+ *   obtaining a copy of this software and associated documentation
+ *   files (the "Software"), to deal in the Software without
+ *   restriction, including without limitation the rights to use,
+ *   copy, modify, merge, publish, distribute, sublicense, and/or
+ *   sell copies of the Software, and to permit persons to whom
+ *   the Software is furnished to do so, subject to the following
+ *   conditions:
+ *
+ *   The above copyright notice and this permission notice shall
+ *   be included in all copies or substantial portions of the Software.
+ *
+ *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *   OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef _ILOG2_H
+#define _ILOG2_H
+
+/*
+ * Computes floor(log2(x)) -- undefined for x = 0.
+ */
+
+#include <klibc/compiler.h>
+#include <stdint.h>
+
+static inline __constfunc uint32_t ilog2(uint32_t __v)
+{
+# if __GNUC__ >= 4
+    return __builtin_clz(__v) ^ 31;
+# else
+    asm("bsrl %1,%0" : "=r" (__v) : "rm" (__v));
+    return __v;
+# endif
+}
+
+#endif /* _ILOG2_H */
index 8d73239..9357746 100644 (file)
@@ -34,6 +34,7 @@
 #include <sys/stat.h>
 #include <minmax.h>
 #include <stdbool.h>
+#include <ilog2.h>
 #include <syslinux/loadfile.h>
 #include "vesa.h"
 #include "video.h"
@@ -255,8 +256,7 @@ int vesacon_default_background(void)
 
     z = max(__vesa_info.mi.v_res, __vesa_info.mi.h_res) >> 1;
     z = ((z*z) >> 11) - 1;
-    asm("bsrl %1,%0" : "=r" (shft) : "rm" (z));
-    shft++;
+    shft = ilog2(z) + 1;
 
     for (y = 0, dy = -(__vesa_info.mi.v_res >> 1);
         y < __vesa_info.mi.v_res; y++, dy++) {
index 9740ea1..32dce9e 100644 (file)
@@ -30,6 +30,7 @@
 #include <klibc/compiler.h>
 #include <string.h>
 #include <com32.h>
+#include <ilog2.h>
 #include "vesa.h"
 #include "video.h"
 
@@ -41,12 +42,6 @@ static struct win_info {
     int win_num;
 } wi;
 
-static inline int __constfunc ilog2(unsigned int x)
-{
-    asm("bsrl %1,%0" : "=r"(x) : "rm"(x));
-    return x;
-}
-
 void __vesacon_init_copy_to_screen(void)
 {
     struct vesa_mode_info *const mi = &__vesa_info.mi;
index 9877a4d..54cd3b5 100644 (file)
@@ -6,6 +6,7 @@
 #include <core.h>
 #include <disk.h>
 #include <fs.h>
+#include <ilog2.h>
 #include <klibc/compiler.h>
 #include "codepage.h"
 #include "fat_fs.h"
@@ -729,12 +730,6 @@ static int vfat_load_config(void)
     return 0;
 }
 
-static inline __constfunc uint32_t bsr(uint32_t num)
-{
-    asm("bsrl %1,%0" : "=r" (num) : "rm" (num));
-    return num;
-}
-
 /* init. the fs meta data, return the block size in bits */
 static int vfat_fs_init(struct fs_info *fs)
 {
@@ -767,7 +762,7 @@ static int vfat_fs_init(struct fs_info *fs)
     sbi->root_size = root_dir_size(fs, &fat);
     sbi->data      = sbi->root + sbi->root_size;
 
-    sbi->clust_shift      = bsr(fat.bxSecPerClust);
+    sbi->clust_shift      = ilog2(fat.bxSecPerClust);
     sbi->clust_byte_shift = sbi->clust_shift + fs->sector_shift;
     sbi->clust_mask       = fat.bxSecPerClust - 1;
     sbi->clust_size       = fat.bxSecPerClust << fs->sector_shift;