[PATCH] Use x86 bsr instruction in Log2 functions

Matt Turner mattst88 at gmail.com
Mon Sep 17 12:37:02 PDT 2007


This patch edits RADEONLog2 and ATILog2 to use the x86 bsr instruction
instread of looping through bits. It should provide a somewhat of a
speed increase in this function on x86 and AMD64 architectures. Note:
the bsr instruction was added with the 80386 CPU and is therefore not
compatible with earlier CPUs.

diff --git a/src/radeon_exa.c b/src/radeon_exa.c
index d074f08..65bd4d2 100644
--- a/src/radeon_exa.c
+++ b/src/radeon_exa.c
@@ -99,10 +99,17 @@ static __inline__ int
 RADEONLog2(int val)
 {
       int bits;
-
+#ifdef __i386__ || defined __amd64__ || defined __x86_64__
+       __asm volatile("bsrl %1,%0\n"
+               : "=r" (bits)
+               : "c" (val)
+       );
+       return bits;
+#else
       for (bits = 0; val != 0; val >>= 1, ++bits)
               ;
       return bits - 1;
+#endif
 }

 static __inline__ CARD32 F_TO_DW(float val)
diff --git a/src/radeon_render.c b/src/radeon_render.c
index 5074fe1..da22f3f 100644
--- a/src/radeon_render.c
+++ b/src/radeon_render.c
@@ -250,10 +250,17 @@ static __inline__ int
 ATILog2(int val)
 {
       int bits;
-
+#ifdef __i386__ || defined __amd64__ || defined __x86_64__
+       __asm volatile("bsrl %1,%0\n"
+               : "=r" (bits)
+               : "c" (val)
+       );
+       return bits;
+#else
       for (bits = 0; val != 0; val >>= 1, ++bits)
               ;
       return bits - 1;
+#endif
 }

 static void



More information about the xorg mailing list