[parisc-linux] a fast fls also for 2.6?
Joel Soete
jsoe0708@tiscali.be
Thu, 7 Aug 2003 17:37:35 +0200
Hi pa,
well as last 2.6 doesn't yet boot on my b2k and having any chance to grab
any debug info (I tried 32bits and 64bits kernel: same results. And only
TOC just refer to unrelevant info. OTC it seems to works fine on the b180.
I really don't know where to look for this bug?), I tried to understand better
Lamont's Fastffs code. To verify that I actualy understand it, I tried this
Fast_fls:
#include <stdio.h>
#include <limits.h>
int generic_fls(int x)
{
int r = 32;
if (!x)
return 0;
if (!(x & 0xffff0000u)) {
x <<= 16;
r -= 16;
}
if (!(x & 0xff000000u)) {
x <<= 8;
r -= 8;
}
if (!(x & 0xf0000000u)) {
x <<= 4;
r -= 4;
}
if (!(x & 0xc0000000u)) {
x <<= 2;
r -= 2;
}
if (!(x & 0x80000000u)) {
x <<= 1;
r -= 1;
}
return r;
}
int PseudoFast_fls(int x)
{
/*
Rewritte off generic_fls to mimic what would be done in asm
(just as proof of concept)
*/
int r = 1;
if (!x)
return 0;
if (!(x & 0xffff0000u))
x <<= 16;
else
r += 16;
if (!(x & 0xff000000u))
x <<= 8;
else
r += 8;
if (!(x & 0xf0000000u))
x <<= 4;
else
r += 4;
if (!(x & 0xc0000000u))
x <<= 2;
else
r += 2;
if (!(x & 0x80000000u))
x <<= 1;
else
r += 1;
return r;
}
int __fls(int x)
{
int ret;
__asm__(" ldi 1,%1\n"
" extru,<> %0,15,16,%%r0\n"
" zdep,TR %0,15,16,%0\n"
" addi 16,%1,%1\n"
" extru,<> %0,7,8,%%r19\n"
" zdep,TR %0,23,24,%0\n"
" addi 8,%1,%1\n"
" extru,<> %0,3,4,%%r19\n"
" zdep,TR %0,27,28,%0\n"
" addi 4,%1,%1\n"
" extru,<> %0,1,2,%%r19\n"
" zdep,TR %0,29,30,%0\n"
" addi 2,%1,%1\n"
" extru,= %0,0,1,%%r19\n"
" addi 1,%1,%1\n"
: "=r" (x), "=r" (ret)
: "0" (x), "1" (ret));
return ret;
}
int Fastfls(int x)
{
int ret;
if (!x)
return 0;
return (__fls(x));
}
main()
{
unsigned int i;
for (i=0; i<0xffffffffU; i++) {
/* if (generic_fls(i) != PseudoFast_fls(i)) */
if (generic_fls(i) != Fastfls(i))
printf ("Problem with i = %#010x (%d)\n", i, i);
}
}
Cheers,
Joel
PS: Don not hesitate to let me know if you would like that I make a patch
with this stuff
------------------------------------------------------
Soldes Tiscali ADSL : 27,50 euros/mois jusque fin 2003.
On s'habitue vite à payer son ADSL moins cher!
Plus d'info? Cliquez ici... http://reg.tiscali.be/default.asp?lg=fr