kernel - Add bsflong() asm functions
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 2 Nov 2011 06:21:59 +0000 (23:21 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 2 Nov 2011 06:21:59 +0000 (23:21 -0700)
* Add bsflong() inline asm functions which operate on the 'long' data type.

sys/cpu/i386/include/cpufunc.h
sys/cpu/x86_64/include/cpufunc.h

index f6ad973..f6a3718 100644 (file)
@@ -91,6 +91,15 @@ bsfl(u_int mask)
        return (result);
 }
 
+static __inline u_int
+bsflong(u_long mask)
+{
+       u_long  result;
+
+       __asm __volatile("bsfl %0,%0" : "=r" (result) : "0" (mask));
+       return (result);
+}
+
 /*
  * Find the last 1 in mask, starting with bit 31 and return the
  * bit number.  If mask is 0 the result is undefined.
index 565233c..7b97979 100644 (file)
@@ -97,6 +97,15 @@ bsfq(u_long mask)
        return (result);
 }
 
+static __inline u_long
+bsflong(u_long mask)
+{
+       u_long  result;
+
+       __asm __volatile("bsfq %1,%0" : "=r" (result) : "rm" (mask));
+       return (result);
+}
+
 static __inline u_int
 bsrl(u_int mask)
 {