~ chicken-core (chicken-5) 9973d0e33211d0452e033d48fd010dddb1364e6e
commit 9973d0e33211d0452e033d48fd010dddb1364e6e
Author: Evan Hanson <evhan@foldling.org>
AuthorDate: Wed Jan 13 15:08:58 2016 +1300
Commit: Evan Hanson <evhan@foldling.org>
CommitDate: Tue Mar 8 22:52:33 2016 +1300
Move bitwise procedures to new chicken.bitwise module
Refactors the make rules for import libraries to allow building files
for modules that don't have their own unit, and moves `bitwise-and` et
al. into a dedicated module within the library unit.
diff --git a/README b/README
index 7fb57d91..d950e28a 100644
--- a/README
+++ b/README
@@ -286,6 +286,7 @@
| |-- chicken
| | `-- 8
| | |-- chicken.import.so
+ | | |-- chicken.bitwise.import.so
| | |-- chicken.continuation.import.so
| | |-- chicken.data-structures.import.so
| | |-- chicken.eval.import.so
diff --git a/c-backend.scm b/c-backend.scm
index 8ccfc08e..575084cd 100644
--- a/c-backend.scm
+++ b/c-backend.scm
@@ -38,6 +38,7 @@
foreign-type-declaration)
(import chicken scheme
+ chicken.bitwise
chicken.data-structures
chicken.compiler.core
chicken.compiler.c-platform
diff --git a/c-platform.scm b/c-platform.scm
index 1bccf350..757df6a7 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -138,14 +138,17 @@
current-input-port current-output-port) )
(set! default-extended-bindings
- '(bignum? cplxnum? ratnum? bitwise-and bitwise-ior bitwise-xor bitwise-not
+ '(bignum? cplxnum? ratnum? chicken.bitwise#integer-length
+ chicken.bitwise#bitwise-and chicken.bitwise#bitwise-not
+ chicken.bitwise#bitwise-ior chicken.bitwise#bitwise-xor
+ chicken.bitwise#arithmetic-shift chicken.bitwise#bit-set?
add1 sub1 fx+ fx- fx* fx/ fxgcd fx+? fx-? fx*? fx/? fxmod fxrem fp/?
fx= fx> fx< fx>= fx<= fixnum? fxneg fxmax fxmin fxlen fxand fxnot fxior
- fxxor fxshr fxshl bit-set? fxodd? fxeven? fp+ fp- fp* fp/ fpmin fpmax fpneg
+ fxxor fxshr fxshl fxodd? fxeven? fp+ fp- fp* fp/ fpmin fpmax fpneg
fpgcd fp> fp< fp= fp>= fp<= fpfloor fpceiling fptruncate fpround fpsin
fpcos fptan fpasin fpacos fpatan fpatan2 fpexp fpexpt fplog fpsqrt fpabs
- fpinteger? exact-integer? flonum? nan? finite? infinite? integer-length
- arithmetic-shift void flush-output print print* error call/cc blob-size
+ fpinteger? exact-integer? flonum? nan? finite? infinite?
+ void flush-output print print* error call/cc blob-size
identity blob=? equal=? make-polar make-rectangular real-part imag-part
string->symbol symbol-append foldl foldr setter
current-error-port current-thread get-keyword
@@ -565,11 +568,11 @@
(rewrite 'abs 14 'fixnum 1 "C_fixnum_abs" "C_fixnum_abs")
-(rewrite 'bitwise-and 21 -1 "C_fixnum_and" "C_u_fixnum_and" "C_s_a_i_bitwise_and" 6)
-(rewrite 'bitwise-xor 21 0 "C_fixnum_xor" "C_fixnum_xor" "C_s_a_i_bitwise_xor" 6)
-(rewrite 'bitwise-ior 21 0 "C_fixnum_or" "C_u_fixnum_or" "C_s_a_i_bitwise_ior" 6)
+(rewrite 'chicken.bitwise#bitwise-and 21 -1 "C_fixnum_and" "C_u_fixnum_and" "C_s_a_i_bitwise_and" 6)
+(rewrite 'chicken.bitwise#bitwise-xor 21 0 "C_fixnum_xor" "C_fixnum_xor" "C_s_a_i_bitwise_xor" 6)
+(rewrite 'chicken.bitwise#bitwise-ior 21 0 "C_fixnum_or" "C_u_fixnum_or" "C_s_a_i_bitwise_ior" 6)
-(rewrite 'bitwise-not 22 1 "C_s_a_i_bitwise_not" #t 6 "C_fixnum_not")
+(rewrite 'chicken.bitwise#bitwise-not 22 1 "C_s_a_i_bitwise_not" #t 6 "C_fixnum_not")
(rewrite 'fp+ 16 2 "C_a_i_flonum_plus" #f words-per-flonum)
(rewrite 'fp- 16 2 "C_a_i_flonum_difference" #f words-per-flonum)
@@ -779,7 +782,7 @@
(rewrite 'fxrem 17 2 "C_i_fixnum_remainder_checked")
(rewrite
- 'arithmetic-shift 8
+ 'chicken.bitwise#arithmetic-shift 8
(lambda (db classargs cont callargs)
;; (arithmetic-shift <x> <-int>)
;; -> (##core#inline "C_fixnum_shift_right" <x> -<int>)
@@ -1001,7 +1004,7 @@
(list arg)) ) ) ) ) ) ) )
(rewrite
- 'bit-set? 8
+ 'chicken.bitwise#bit-set? 8
(lambda (db classargs cont callargs)
(and (= 2 (length callargs))
(make-node
@@ -1013,7 +1016,7 @@
callargs) ) ) ) ) )
(rewrite
- 'integer-length 8
+ 'chicken.bitwise#integer-length 8
(lambda (db classargs cont callargs)
(and (= 1 (length callargs))
(make-node
diff --git a/chicken-install.scm b/chicken-install.scm
index d1924685..79dfc7c6 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -45,7 +45,7 @@
(define +default-repository-files+
;;XXX keep this up-to-date!
- '("chicken.continuation.import.so"
+ '("chicken.bitwise.import.so"
"chicken.data-structures.import.so"
"chicken.eval.import.so"
"chicken.expand.import.so"
diff --git a/chicken.import.scm b/chicken.import.scm
index b8408c34..3745a79f 100644
--- a/chicken.import.scm
+++ b/chicken.import.scm
@@ -30,13 +30,7 @@
add1
argc+argv
argv
- arithmetic-shift
bignum?
- bit-set?
- bitwise-and
- bitwise-ior
- bitwise-not
- bitwise-xor
blob->string
blob-size
blob?
@@ -167,7 +161,6 @@
getter-with-setter
implicit-exit-handler
infinite?
- integer-length
(ir-macro-transformer . chicken.expand#ir-macro-transformer)
keyword->string
keyword-style
diff --git a/defaults.make b/defaults.make
index 65ccce10..7ca9bc87 100644
--- a/defaults.make
+++ b/defaults.make
@@ -263,9 +263,9 @@ CHICKEN_PROGRAM_OPTIONS += $(if $(PROFILE_OBJECTS),-profile)
# import libraries
PRIMITIVE_IMPORT_LIBRARIES = chicken csi chicken.foreign
-POSIX_IMPORT_LIBRARY = chicken.posix
DYNAMIC_IMPORT_LIBRARIES = setup-api setup-download srfi-4
-DYNAMIC_CHICKEN_IMPORT_LIBRARIES = data-structures eval repl expand \
+DYNAMIC_CHICKEN_IMPORT_LIBRARIES = bitwise posix
+DYNAMIC_CHICKEN_UNIT_IMPORT_LIBRARIES = data-structures eval repl expand \
continuation extras files internal irregex lolevel ports tcp utils
# targets
@@ -279,10 +279,10 @@ CHICKEN_UNINSTALL_PROGRAM = $(PROGRAM_PREFIX)chicken-uninstall$(PROGRAM_SUFFIX)
CHICKEN_STATUS_PROGRAM = $(PROGRAM_PREFIX)chicken-status$(PROGRAM_SUFFIX)
CHICKEN_BUG_PROGRAM = $(PROGRAM_PREFIX)chicken-bug$(PROGRAM_SUFFIX)
CHICKEN_DEBUGGER_PROGRAM ?= $(PROGRAM_PREFIX)feathers$(PROGRAM_SUFFIX)$(SCRIPT_EXT)
-IMPORT_LIBRARIES = $(POSIX_IMPORT_LIBRARY) \
- $(DYNAMIC_IMPORT_LIBRARIES) \
+IMPORT_LIBRARIES = $(DYNAMIC_IMPORT_LIBRARIES) \
$(PRIMITIVE_IMPORT_LIBRARIES) \
- $(foreach lib,$(DYNAMIC_CHICKEN_IMPORT_LIBRARIES),chicken.$(lib))
+ $(foreach lib,$(DYNAMIC_CHICKEN_IMPORT_LIBRARIES),chicken.$(lib)) \
+ $(foreach lib,$(DYNAMIC_CHICKEN_UNIT_IMPORT_LIBRARIES),chicken.$(lib))
ifdef STATICBUILD
CHICKEN_STATIC_EXECUTABLE = $(CHICKEN_PROGRAM)$(EXE)
diff --git a/distribution/manifest b/distribution/manifest
index 51c4f6ba..9b56d71d 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -244,6 +244,8 @@ chicken-syntax.c
common-declarations.scm
chicken.import.scm
chicken.import.c
+chicken.bitwise.import.scm
+chicken.bitwise.import.c
chicken.continuation.import.scm
chicken.continuation.import.c
chicken.data-structures.import.scm
diff --git a/eval.scm b/eval.scm
index 7bb00ae8..f79e681b 100644
--- a/eval.scm
+++ b/eval.scm
@@ -74,6 +74,7 @@
(define-constant core-chicken-modules
'((chicken . chicken-syntax)
+ (chicken.bitwise . library)
(chicken.continuation . continuation)
(chicken.data-structures . data-structures)
(chicken.eval . eval)
diff --git a/library.scm b/library.scm
index 49688678..5f56b3d4 100644
--- a/library.scm
+++ b/library.scm
@@ -1406,21 +1406,21 @@ EOF
((4) (values 2 0))
(else (error "this should never happen")))
(let*-values
- (((len/4) (fxshr (fx+ (integer-length a) 1) 2))
+ (((len/4) (fxshr (fx+ (chicken.bitwise#integer-length a) 1) 2))
((len/2) (fxshl len/4 1))
((s^ r^) (##sys#exact-integer-sqrt
- (arithmetic-shift a (fxneg len/2))))
- ((mask) (- (arithmetic-shift 1 len/4) 1))
- ((a0) (bitwise-and a mask))
- ((a1) (bitwise-and (arithmetic-shift a (fxneg len/4)) mask))
+ (chicken.bitwise#arithmetic-shift a (fxneg len/2))))
+ ((mask) (- (chicken.bitwise#arithmetic-shift 1 len/4) 1))
+ ((a0) (chicken.bitwise#bitwise-and a mask))
+ ((a1) (chicken.bitwise#bitwise-and (chicken.bitwise#arithmetic-shift a (fxneg len/4)) mask))
((q u) ((##core#primitive "C_u_integer_quotient_and_remainder")
- (+ (arithmetic-shift r^ len/4) a1)
- (arithmetic-shift s^ 1)))
- ((s) (+ (arithmetic-shift s^ len/4) q))
- ((r) (+ (arithmetic-shift u len/4) (- a0 (* q q)))))
+ (+ (chicken.bitwise#arithmetic-shift r^ len/4) a1)
+ (chicken.bitwise#arithmetic-shift s^ 1)))
+ ((s) (+ (chicken.bitwise#arithmetic-shift s^ len/4) q))
+ ((r) (+ (chicken.bitwise#arithmetic-shift u len/4) (- a0 (* q q)))))
(if (negative? r)
(values (- s 1)
- (- (+ r (arithmetic-shift s 1)) 1))
+ (- (+ r (chicken.bitwise#arithmetic-shift s 1)) 1))
(values s r)))))
(define (exact-integer-sqrt x)
@@ -1465,12 +1465,12 @@ EOF
(define (##sys#exact-integer-nth-root/loc loc k n)
(if (or (eq? 0 k) (eq? 1 k) (eq? 1 n)) ; Maybe call exact-integer-sqrt on n=2?
(values k 0)
- (let ((len (integer-length k)))
+ (let ((len (chicken.bitwise#integer-length k)))
(if (< len n) ; Idea from Gambit: 2^{len-1} <= k < 2^{len}
(values 1 (- k 1)) ; Since x >= 2, we know x^{n} can't exist
;; Set initial guess to (at least) 2^ceil(ceil(log2(k))/n)
(let* ((shift-amount (inexact->exact (ceiling (/ (fx+ len 1) n))))
- (g0 (arithmetic-shift 1 shift-amount))
+ (g0 (chicken.bitwise#arithmetic-shift 1 shift-amount))
(n-1 (- n 1)))
(let lp ((g0 g0)
(g1 (quotient
@@ -1492,7 +1492,7 @@ EOF
(cond
((eq? e2 0) res)
((even? e2) ; recursion is faster than iteration here
- (* res (square (lp 1 (arithmetic-shift e2 -1)))))
+ (* res (square (lp 1 (chicken.bitwise#arithmetic-shift e2 -1)))))
(else
(lp (* res base) (- e2 1)))))))
@@ -1637,12 +1637,12 @@ EOF
(if (not (negative? point))
(exact->inexact (* mant (##sys#integer-power 10 point)))
(let* ((scl (##sys#integer-power 10 (abs point)))
- (bex (fx- (fx- (integer-length mant) (integer-length scl))
+ (bex (fx- (fx- (chicken.bitwise#integer-length mant) (chicken.bitwise#integer-length scl))
flonum-precision)))
(if (fx< bex 0)
- (let* ((num (arithmetic-shift mant (fxneg bex)))
+ (let* ((num (chicken.bitwise#arithmetic-shift mant (fxneg bex)))
(quo (round-quotient num scl)))
- (cond ((> (integer-length quo) flonum-precision)
+ (cond ((> (chicken.bitwise#integer-length quo) flonum-precision)
;; Too many bits of quotient; readjust
(set! bex (fx+ 1 bex))
(set! quo (round-quotient num (* scl 2)))))
@@ -4164,15 +4164,17 @@ EOF
;;; Bitwise operations:
;; From SRFI-33
-(define (integer-length x) (##core#inline "C_i_integer_length" x))
-(define (bit-set? n i) (##core#inline "C_i_bit_setp" n i))
+(module chicken.bitwise *
+(import scheme chicken)
(define bitwise-and (##core#primitive "C_bitwise_and"))
(define bitwise-ior (##core#primitive "C_bitwise_ior"))
(define bitwise-xor (##core#primitive "C_bitwise_xor"))
(define (bitwise-not n) (##core#inline_allocate ("C_s_a_i_bitwise_not" 6) n))
+(define (bit-set? n i) (##core#inline "C_i_bit_setp" n i))
+(define (integer-length x) (##core#inline "C_i_integer_length" x))
(define (arithmetic-shift n m)
- (##core#inline_allocate ("C_s_a_i_arithmetic_shift" 6) n m))
+ (##core#inline_allocate ("C_s_a_i_arithmetic_shift" 6) n m)))
;;; String ports:
;
diff --git a/manual/Unit library b/manual/Unit library
index e915cc3e..9064dd19 100644
--- a/manual/Unit library
+++ b/manual/Unit library
@@ -19,6 +19,9 @@ Adds/subtracts 1 from {{N}}.
==== Binary integer operations
+Binary integer operations are provided by the {{(chicken bitwise)}}
+module.
+
<procedure>(bitwise-and N1 ...)</procedure>
<procedure>(bitwise-ior N1 ...)</procedure>
<procedure>(bitwise-xor N1 ...)</procedure>
diff --git a/modules.scm b/modules.scm
index 32a66a40..367c07fd 100644
--- a/modules.scm
+++ b/modules.scm
@@ -931,6 +931,7 @@
(##sys#register-primitive-module 'r5rs-null '() r4rs-syntax))
(##sys#register-module-alias 'r5rs 'scheme)
+(##sys#register-module-alias 'bitwise 'chicken.bitwise)
(##sys#register-module-alias 'continuation 'chicken.continuation)
(##sys#register-module-alias 'data-structures 'chicken.data-structures)
(##sys#register-module-alias 'extras 'chicken.extras)
diff --git a/posixunix.scm b/posixunix.scm
index 899ead6a..5773fc7d 100644
--- a/posixunix.scm
+++ b/posixunix.scm
@@ -87,7 +87,8 @@
utc-time->seconds with-input-from-pipe with-output-to-pipe)
(import scheme chicken)
-(import chicken.files
+(import chicken.bitwise
+ chicken.files
chicken.foreign
chicken.irregex
chicken.ports)
diff --git a/posixwin.scm b/posixwin.scm
index dbdd9160..9990881d 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -712,7 +712,8 @@ EOF
utc-time->seconds with-input-from-pipe with-output-to-pipe)
(import scheme chicken)
-(import chicken.data-structures
+(import chicken.bitwise
+ chicken.data-structures
chicken.extras
chicken.files
chicken.foreign
diff --git a/rules.make b/rules.make
index fa77c327..a2644962 100644
--- a/rules.make
+++ b/rules.make
@@ -85,8 +85,9 @@ DISTFILES = $(filter-out runtime.c,$(LIBCHICKEN_OBJECTS_1:=.c)) \
$(IMPORT_LIBRARIES:=.import.c) \
$(DYNAMIC_IMPORT_LIBRARIES:=.import.scm) \
$(foreach lib,$(DYNAMIC_CHICKEN_IMPORT_LIBRARIES),chicken.$(lib).import.scm) \
+ $(foreach lib,$(DYNAMIC_CHICKEN_UNIT_IMPORT_LIBRARIES),chicken.$(lib).import.scm) \
$(foreach lib,$(filter-out chicken,$(COMPILER_OBJECTS_1)),chicken.compiler.$(lib).import.scm) \
- $(POSIX_IMPORT_LIBRARY:=.import.scm) posixunix.c posixwin.c
+ posixunix.c posixwin.c
# Remove the duplicate $(POSIXFILE) entry:
DISTFILES := $(sort $(DISTFILES))
@@ -492,34 +493,32 @@ endif
define declare-emitted-import-lib-dependency
.SECONDARY: $(1).import.scm
-$(1).import.scm: $(1).c
+$(1).import.scm: $(2).c
endef
define declare-emitted-chicken-import-lib-dependency
-.SECONDARY: chicken.$(1).import.scm
-chicken.$(1).import.scm: $(1).c
+$(call declare-emitted-import-lib-dependency,chicken.$(1),$(1))
endef
define declare-emitted-compiler-import-lib-dependency
-.SECONDARY: chicken.compiler.$(1).import.scm
-chicken.compiler.$(1).import.scm: $(1).c
+$(call declare-emitted-import-lib-dependency,chicken.compiler.$(1),$(1))
endef
$(foreach lib, $(SETUP_API_OBJECTS_1),\
- $(eval $(call declare-emitted-import-lib-dependency,$(lib))))
+ $(eval $(call declare-emitted-import-lib-dependency,$(lib),$(lib))))
$(foreach lib, $(DYNAMIC_IMPORT_LIBRARIES),\
- $(eval $(call declare-emitted-import-lib-dependency,$(lib))))
+ $(eval $(call declare-emitted-import-lib-dependency,$(lib),$(lib))))
-$(foreach lib, $(DYNAMIC_CHICKEN_IMPORT_LIBRARIES),\
+$(foreach lib, $(DYNAMIC_CHICKEN_UNIT_IMPORT_LIBRARIES),\
$(eval $(call declare-emitted-chicken-import-lib-dependency,$(lib))))
$(foreach lib, $(filter-out chicken,$(COMPILER_OBJECTS_1)),\
$(eval $(call declare-emitted-compiler-import-lib-dependency,$(lib))))
-# posix declared manually, as it varies based on POSIXFILE
-.SECONDARY: chicken.posix.import.scm
-chicken.posix.import.scm: $(POSIXFILE).c
+# special cases for modules not corresponding directly to units
+$(eval $(call declare-emitted-import-lib-dependency,chicken.posix,$(POSIXFILE)))
+$(eval $(call declare-emitted-import-lib-dependency,chicken.bitwise,library))
chicken.c: chicken.scm mini-srfi-1.scm \
chicken.compiler.batch-driver.import.scm \
@@ -549,6 +548,7 @@ c-backend.c: c-backend.scm mini-srfi-1.scm \
chicken.compiler.c-platform.import.scm \
chicken.compiler.support.import.scm \
chicken.compiler.core.import.scm \
+ chicken.bitwise.import.scm \
chicken.data-structures.import.scm \
chicken.extras.import.scm
core.c: core.scm mini-srfi-1.scm \
@@ -659,12 +659,18 @@ setup-download.c: setup-download.scm \
chicken.tcp.import.scm \
chicken.utils.import.scm \
setup-api.import.scm
+srfi-4.c: srfi-4.scm \
+ chicken.bitwise.import.scm \
+ chicken.expand.import.scm \
+ chicken.foreign.import.scm
posixunix.c: posixunix.scm \
+ chicken.bitwise.import.scm \
chicken.files.import.scm \
chicken.foreign.import.scm \
chicken.irregex.import.scm \
chicken.ports.import.scm
posixwin.c: posixwin.scm \
+ chicken.bitwise.import.scm \
chicken.files.import.scm \
chicken.foreign.import.scm \
chicken.irregex.import.scm \
@@ -706,7 +712,7 @@ endef
bootstrap-lib = $(CHICKEN) $(call profile-flags, $@) $< $(CHICKEN_LIBRARY_OPTIONS) -output-file $@
library.c: $(SRCDIR)library.scm $(SRCDIR)banner.scm $(SRCDIR)common-declarations.scm
- $(bootstrap-lib)
+ $(bootstrap-lib) -emit-import-library chicken.bitwise
internal.c: $(SRCDIR)internal.scm $(SRCDIR)mini-srfi-1.scm
$(bootstrap-lib) -emit-import-library chicken.internal
eval.c: $(SRCDIR)eval.scm $(SRCDIR)common-declarations.scm $(SRCDIR)mini-srfi-1.scm
diff --git a/srfi-4.scm b/srfi-4.scm
index fffdd73f..5d77a7b4 100644
--- a/srfi-4.scm
+++ b/srfi-4.scm
@@ -79,7 +79,8 @@ EOF
write-u8vector)
(import scheme chicken)
-(import chicken.expand
+(import chicken.bitwise
+ chicken.expand
chicken.foreign)
(include "common-declarations.scm")
diff --git a/tests/compiler-tests.scm b/tests/compiler-tests.scm
index 33f2d65c..037ae156 100644
--- a/tests/compiler-tests.scm
+++ b/tests/compiler-tests.scm
@@ -1,8 +1,8 @@
;;;; compiler-tests.scm
-(import (chicken foreign) srfi-4)
-(import-for-syntax data-structures (chicken expand))
+(import bitwise foreign srfi-4)
+(import-for-syntax data-structures expand)
;; test dropping of previous toplevel assignments
diff --git a/tests/fft.scm b/tests/fft.scm
index a0030619..d0c2aacc 100644
--- a/tests/fft.scm
+++ b/tests/fft.scm
@@ -8,7 +8,8 @@
(extended-bindings)
(block)
(not safe)))
- (else))
+ (else
+ (use bitwise)))
;;; All the following redefinitions are *ignored* by the Gambit compiler
;;; because of the declarations above.
diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index b6c3879d..5d860f53 100644
--- a/tests/library-tests.scm
+++ b/tests/library-tests.scm
@@ -1,6 +1,6 @@
;;;; library-tests.scm
-(use extras ports)
+(use bitwise extras ports)
(define-syntax assert-fail
(syntax-rules ()
diff --git a/tests/numbers-test-ashinn.scm b/tests/numbers-test-ashinn.scm
index bbedff1c..16913566 100644
--- a/tests/numbers-test-ashinn.scm
+++ b/tests/numbers-test-ashinn.scm
@@ -1,5 +1,7 @@
(include "test.scm")
+(use bitwise)
+
(current-test-epsilon 0) ;; We want exact comparisons by default
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/tests/numbers-test-gauche.scm b/tests/numbers-test-gauche.scm
index 2d4b5f15..8dd9079c 100644
--- a/tests/numbers-test-gauche.scm
+++ b/tests/numbers-test-gauche.scm
@@ -47,6 +47,9 @@
(+ (expt 2 (expt 2 n)) 1))
;; Gauche compat
+
+(use bitwise)
+
(define (greatest-fixnum) most-positive-fixnum)
(define (least-fixnum) most-negative-fixnum)
(define (fixnum-width) fixnum-precision)
diff --git a/tests/numbers-test.scm b/tests/numbers-test.scm
index dcee51fe..527f809e 100644
--- a/tests/numbers-test.scm
+++ b/tests/numbers-test.scm
@@ -1,7 +1,7 @@
;;;; numbers-test.scm
(include "test.scm")
-(use extras posix)
+(use bitwise extras posix)
;; The default "comparator" doesn't know how to deal with extended number types
(current-test-comparator
diff --git a/tests/runtests.sh b/tests/runtests.sh
index b279ae88..41aaa2e1 100755
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -39,6 +39,7 @@ for x in \
chicken.import.so csi.import.so types.db \
setup-api.so setup-api.import.so srfi-4.import.so \
setup-download.so setup-download.import.so \
+ chicken.bitwise.import.so \
chicken.continuation.import.so \
chicken.data-structures.import.so \
chicken.extras.import.so \
diff --git a/types.db b/types.db
index 93cd59f5..5cc68e5e 100644
--- a/types.db
+++ b/types.db
@@ -870,13 +870,15 @@
(argc+argv (#(procedure #:clean) argc+argv () fixnum pointer))
(argv (#(procedure #:clean) argv () (list-of string)))
-(integer-length (#(procedure #:clean #:enforce #:foldable) integer-length (integer) fixnum)
+
+(chicken.bitwise#integer-length
+ (#(procedure #:clean #:enforce #:foldable) chicken.bitwise#integer-length (integer) fixnum)
((fixnum) (##core#inline "C_i_fixnum_length" #(1)))
((*) (##core#inline "C_i_integer_length" #(1))))
-(arithmetic-shift (#(procedure #:clean #:enforce #:foldable) arithmetic-shift (integer fixnum) integer)
- ((* *) (##core#inline_allocate ("C_s_a_i_arithmetic_shift" 6)
- #(1) #(2))))
+(chicken-bitwise#arithmetic-shift
+ (#(procedure #:clean #:enforce #:foldable) chicken.bitwise#arithmetic-shift (integer fixnum) integer)
+ ((* *) (##core#inline_allocate ("C_s_a_i_arithmetic_shift" 6) #(1) #(2))))
(exact-integer-nth-root (#(procedure #:clean #:enforce #:foldable) exact-integer-nth-root (integer integer) integer integer)
((integer integer) (##sys#exact-integer-nth-root/loc 'exact-integer-nth-root #(1) #(2))))
@@ -886,32 +888,37 @@
(bignum? (#(procedure #:pure #:predicate bignum) bignum? (*) boolean))
-(bit-set? (#(procedure #:clean #:enforce #:foldable) bit-set? (integer integer) boolean)
+(chicken.bitwise#bit-set?
+ (#(procedure #:clean #:enforce #:foldable) chicken.bitwise#bit-set? (integer integer) boolean)
((fixnum fixnum) (##core#inline "C_i_fixnum_bit_setp" #(1) #(2)))
((* *) (##core#inline "C_i_bit_setp" #(1) #(2))))
-(bitwise-and (#(procedure #:clean #:enforce #:foldable) bitwise-and (#!rest integer) integer)
+(chicken.bitwise#bitwise-and
+ (#(procedure #:clean #:enforce #:foldable) chicken.bitwise#bitwise-and (#!rest integer) integer)
(() '-1)
((fixnum) (fixnum) #(1))
((integer) #(1))
((fixnum fixnum) (fixnum) (##core#inline "C_u_fixnum_and" #(1) #(2)))
((* *) (##core#inline_allocate ("C_s_a_i_bitwise_and" 6) #(1) #(2))))
-(bitwise-ior (#(procedure #:clean #:enforce #:foldable) bitwise-ior (#!rest integer) integer)
+(chicken.bitwise#bitwise-ior
+ (#(procedure #:clean #:enforce #:foldable) chicken.bitwise#bitwise-ior (#!rest integer) integer)
(() '0)
((fixnum) (fixnum) #(1))
((integer) #(1))
((fixnum fixnum) (fixnum) (##core#inline "C_u_fixnum_or" #(1) #(2)))
((* *) (##core#inline_allocate ("C_s_a_i_bitwise_ior" 6) #(1) #(2))))
-(bitwise-xor (#(procedure #:clean #:enforce #:foldable) bitwise-xor (#!rest integer) integer)
+(chicken.bitwise#bitwise-xor
+ (#(procedure #:clean #:enforce #:foldable) chicken.bitwise#bitwise-xor (#!rest integer) integer)
(() '0)
((fixnum) (fixnum) #(1))
((integer) #(1))
((fixnum fixnum) (fixnum) (##core#inline "C_fixnum_xor" #(1) #(2)))
((* *) (##core#inline_allocate ("C_s_a_i_bitwise_xor" 6) #(1) #(2))))
-(bitwise-not (#(procedure #:clean #:enforce #:foldable) bitwise-not (integer) integer)
+(chicken.bitwise#bitwise-not
+ (#(procedure #:clean #:enforce #:foldable) chicken.bitwise#bitwise-not (integer) integer)
((* *) (##core#inline_allocate ("C_s_a_i_bitwise_not" 6) #(1))))
(blob->string (#(procedure #:clean #:enforce) blob->string (blob) string))
Trap