On 12/04/14 18:50, John-Mark Gurney wrote:
Hans Petter Selasky wrote this message on Thu, Dec 04, 2014 at 08:21 +0100:
On 12/04/14 01:54, John-Mark Gurney wrote:
Hans Petter Selasky wrote this message on Wed, Dec 03, 2014 at 21:55 +0000:
Author: hselasky
Date: Wed Dec  3 21:55:44 2014
New Revision: 275468
URL: https://svnweb.freebsd.org/changeset/base/275468

Log:
   Optimise the bit searching loops, by quickly skipping the 16 first set
   bits if all the 16 first bits are set. This way the worst case
   searching time is reduced from 32 to 16 cycles.

You could use ffs instead:
        x = ffs(~map);
        if (x) {
                x--;
                /* normal code */
        }

This has the benefit of using a single instruction on platforms that
support it (bsfl on i386), though apparently, we haven't optimized this
for all platforms...  arm has a version for int, but their ffsl does
the same linear search instead of just calling ffs, or at least
detecting if sizeof(long) == sizeof(int) and calling ffs...


Yes, I'm aware about that, but like you say it is not optimised for all
platforms yet. So I'm not sure if it will give any benefit for the
platform the driver is running on ....

I'll see if I can change the logic inside the C-version of ffs() and the
do the swap like you suggest.

Did you see the comment about usig __builtin_ffs{,l,ll} instead? this
seems to be a better route...


Hi,

I see. Who can update the cpufunc.h header file to use the builtins? Are these also available with GCC?

--HPS

_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to