diff --git a/src/radeon_exa.c b/src/radeon_exa.c index 4da4841..7695f42 100644 --- a/src/radeon_exa.c +++ b/src/radeon_exa.c @@ -99,10 +99,17 @@ static __inline__ int RADEONLog2(int val) { int bits; - +#if (defined __i386__ || defined __x86_64__) && (defined __GNUC__) + __asm volatile("bsrl %1, %0" + : "=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 a80d136..0908d20 100644 --- a/src/radeon_render.c +++ b/src/radeon_render.c @@ -250,10 +250,17 @@ static __inline__ int ATILog2(int val) { int bits; - +#if (defined __i386__ || defined __x86_64__) && (defined __GNUC__) + __asm volatile("bsrl %1, %0" + : "=r" (bits) + : "c" (val) + ); + return bits; +#else for (bits = 0; val != 0; val >>= 1, ++bits) ; return bits - 1; +#endif } static void