]> gitweb.factorcode.org Git - factor.git/commitdiff
math.bitwise: hotrod nonintrinsic fixnum-bit-count
authorJoe Groff <arcata@gmail.com>
Sat, 12 Nov 2011 06:49:09 +0000 (22:49 -0800)
committerJoe Groff <arcata@gmail.com>
Mon, 14 Nov 2011 00:10:21 +0000 (16:10 -0800)
basis/math/bitwise/bitwise.factor

index 8e96cd5e4f0b61e75efc8f41eb2194e337463b6a..a0d19b49ec351ef77a583d2b76375de963f0b42f 100644 (file)
@@ -2,7 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays assocs combinators combinators.smart fry kernel
 macros math math.bits sequences sequences.private words
-byte-arrays alien alien.c-types alien.data specialized-arrays ;
+byte-arrays alien alien.c-types alien.data specialized-arrays
+kernel.private layouts ;
 SPECIALIZED-ARRAY: uchar
 IN: math.bitwise
 
@@ -86,15 +87,20 @@ DEFER: byte-bit-count
 GENERIC: (bit-count) ( x -- n )
 
 : fixnum-bit-count ( x -- n )
-    0 swap [
-        dup 0 >
-    ] [
-        [ 8 bits byte-bit-count ] [ -8 shift ] bi
-        [ + ] dip
-    ] while drop ;
+    { fixnum } declare
+    [ byte-bit-count ] keep
+    [ -8 shift byte-bit-count + ] keep
+    [ -8 shift byte-bit-count + ] keep
+    [ -8 shift byte-bit-count + ] keep
+    cell 8 = [
+        [ -8 shift byte-bit-count + ] keep
+        [ -8 shift byte-bit-count + ] keep
+        [ -8 shift byte-bit-count + ] keep
+          -8 shift byte-bit-count + >fixnum
+    ] [ drop ] if ;
 
 M: fixnum (bit-count)
-    fixnum-bit-count ; inline
+    fixnum-bit-count { fixnum } declare ; inline
 
 M: bignum (bit-count)
     dup 0 = [ drop 0 ] [