1 ;;;; cross-compile-time-only replacements for modular functions;
2 ;;;; needed for constant-folding
4 ;;;; This software is part of the SBCL system. See the README file for
7 ;;;; This software is derived from the CMU CL system, which was
8 ;;;; written at Carnegie Mellon University and released into the
9 ;;;; public domain. The software is in the public domain and is
10 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
11 ;;;; files for more information.
15 (defun mask-signed-field (size integer
)
18 ((logbitp (1- size
) integer
)
19 (dpb integer
(byte size
0) -
1))
21 (ldb (byte size
0) integer
))))
25 (flet ((unsigned-definition (name lambda-list prototype width
)
26 `(defun ,name
,lambda-list
27 (ldb (byte ,width
0) (,prototype
,@lambda-list
))))
28 (signed-definition (name lambda-list prototype width
)
29 `(defun ,name
,lambda-list
30 (mask-signed-field ,width
(,prototype
,@lambda-list
)))))
31 (flet ((do-mfuns (class)
32 (loop for infos being each hash-value of
(modular-class-funs class
) using
(hash-key prototype
)
34 do
(loop for info in infos
35 for name
= (modular-fun-info-name info
)
36 and width
= (modular-fun-info-width info
)
37 and signedp
= (modular-fun-info-signedp info
)
38 and lambda-list
= (modular-fun-info-lambda-list info
)
40 do
(forms (signed-definition name lambda-list prototype width
))
42 do
(forms (unsigned-definition name lambda-list prototype width
))))))
43 (do-mfuns *untagged-unsigned-modular-class
*)
44 (do-mfuns *untagged-signed-modular-class
*)
45 (do-mfuns *tagged-modular-class
*)))
48 #!+#.
(cl:if
(cl:= sb
!vm
:n-machine-word-bits
32) '(and) '(or))
49 (defun sb!vm
::ash-left-mod32
(integer amount
)
50 (ldb (byte 32 0) (ash integer amount
)))
51 #!+#.
(cl:if
(cl:= sb
!vm
:n-machine-word-bits
64) '(and) '(or))
52 (defun sb!vm
::ash-left-mod64
(integer amount
)
53 (ldb (byte 64 0) (ash integer amount
)))
55 (defun sb!vm
::ash-left-smod30
(integer amount
)
56 (mask-signed-field 30 (ash integer amount
)))
58 (defun sb!vm
::ash-left-smod61
(integer amount
)
59 (mask-signed-field 61 (ash integer amount
)))