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
{ 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 -- ) ;
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
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 -- )
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
: 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