]> gitweb.factorcode.org Git - factor.git/commitdiff
cpu: enable bit-test intrinsic for fixnum-bit?.
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 18 Jun 2015 02:11:10 +0000 (19:11 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 18 Jun 2015 02:11:10 +0000 (19:11 -0700)
basis/compiler/cfg/instructions/instructions.factor
basis/compiler/cfg/intrinsics/intrinsics.factor
basis/compiler/codegen/codegen.factor
basis/cpu/architecture/architecture.factor
basis/cpu/x86/x86.factor
core/math/integers/integers.factor

index 703294e394c2d9bc7e74e60e59ce7c9d1c5eec38..1c445605d2851399cd2d0dc72aaec65ad7e50a0c 100644 (file)
@@ -224,6 +224,11 @@ FOLDABLE-INSN: ##bit-count
 def: dst/int-rep
 use: src/int-rep ;
 
+FOLDABLE-INSN: ##bit-test
+def: dst/tagged-rep
+use: src1/int-rep src2/int-rep
+temp: temp/int-rep ;
+
 ! Float arithmetic
 FOLDABLE-INSN: ##add-float
 def: dst/double-rep
index 7d744e7496f4fd4c968306843d50f44265fc39f4..24b7e05bdc25b8d0c3e97a6c071e40468580b375 100644 (file)
@@ -138,5 +138,10 @@ ERROR: inline-intrinsics-not-supported word quot ;
         { math.bitwise.private:fixnum-bit-count [ drop [ ^^bit-count ] unary-op ] }
     } enable-intrinsics ;
 
+: enable-bit-test ( -- )
+    {
+        { math.integers.private:fixnum-bit? [ drop [ ^^bit-test ] binary-op ] }
+    } enable-intrinsics ;
+
 : emit-intrinsic ( node word -- )
     "intrinsic" word-prop call( node -- ) ;
index a488a36e7f630eb395c9c6f7369cddc48e7ac425..11175ec3669d75151259f5e372ece3d6e3d5d48e 100755 (executable)
@@ -181,6 +181,7 @@ CODEGEN: ##not %not
 CODEGEN: ##neg %neg
 CODEGEN: ##log2 %log2
 CODEGEN: ##bit-count %bit-count
+CODEGEN: ##bit-test %bit-test
 CODEGEN: ##copy %copy
 CODEGEN: ##tagged>integer %tagged>integer
 CODEGEN: ##add-float %add-float
index 6cd42c5752afd7491eb81447b294f621906aefae..7ab49574aa8423bcceb5b75966564a5d5d03bff9 100644 (file)
@@ -271,6 +271,7 @@ HOOK: %not     cpu ( dst src -- )
 HOOK: %neg     cpu ( dst src -- )
 HOOK: %log2    cpu ( dst src -- )
 HOOK: %bit-count cpu ( dst src -- )
+HOOK: %bit-test cpu ( dst src1 src2 temp -- )
 
 HOOK: %copy cpu ( dst src rep -- )
 
index aa9d7683d42a1b8c01bbb00e899ea28bb34874c7..9d67c9339d236307bc35d983bbd95ed097b19829 100644 (file)
@@ -764,6 +764,12 @@ M: x86 immediate-bitwise? ( n -- ? )
 enable-min/max
 enable-log2
 
+M:: x86 %bit-test ( dst src1 src2 temp -- )
+    src1 src2 BT
+    dst temp \ CMOVB (%boolean) ;
+
+enable-bit-test
+
 : check-sse ( -- )
     "Checking for multimedia extensions... " write flush
     sse-version
index 98ca157b72d4ae8a3c2f0d68a7f3f24664006d97..7aae3c5362925b64589cda0d72e044edafcd60ba 100644 (file)
@@ -53,7 +53,7 @@ M: fixnum bitnot fixnum-bitnot ; inline
 
 : fixnum-bit? ( x n -- ? )
     { fixnum fixnum } declare
-    dup 0 >= [ neg shift even? not ] [ 2drop f ] if ; inline
+    dup 0 >= [ neg shift even? not ] [ 2drop f ] if ;
 
 M: fixnum bit? integer>fixnum-strict fixnum-bit? ; inline