(assert (typep array '(simple-array * (*))))
(values array start end 0))
-#!-(or alpha x86-64)
-(progn
- (defun sb!vm::ash-left-mod32 (integer amount)
- (ldb (byte 32 0) (ash integer amount)))
- (defun sb!vm::logxor-mod32 (x y)
- (ldb (byte 32 0) (logxor x y)))
- (defun sb!vm::lognot-mod32 (x)
- (ldb (byte 32 0) (lognot x))))
-#!+(or alpha x86-64)
-(defun sb!vm::ash-left-mod64 (integer amount)
- (ldb (byte 64 0) (ash integer amount)))
-
;;; package locking nops for the cross-compiler
(defmacro without-package-locks (&body body)
--- /dev/null
+;;;; cross-compile-time-only replacements for modular functions;
+;;;; needed for constant-folding
+
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
+
+(in-package "SB!C")
+
+(defun mask-signed-field (size integer)
+ (cond ((zerop size)
+ 0)
+ ((logbitp (1- size) integer)
+ (dpb integer (byte size 0) -1))
+ (t
+ (ldb (byte size 0) integer))))
+
+#.
+(collect ((forms))
+ (flet ((definition (name lambda-list prototype width)
+ `(defun ,name ,lambda-list
+ (ldb (byte ,width 0) (,prototype ,@lambda-list)))))
+ (loop for infos being each hash-value of (modular-class-funs *unsigned-modular-class*) using (hash-key prototype)
+ when (listp infos)
+ do (loop for info in infos
+ for name = (modular-fun-info-name info)
+ and width = (modular-fun-info-width info)
+ and lambda-list = (modular-fun-info-lambda-list info)
+ do (forms (definition name lambda-list prototype width)))))
+ `(progn ,@(forms)))
+
+#.
+(collect ((forms))
+ (flet ((definition (name lambda-list prototype width)
+ `(defun ,name ,lambda-list
+ (mask-signed-field ,width (,prototype ,@lambda-list)))))
+ (loop for infos being each hash-value of (modular-class-funs *signed-modular-class*) using (hash-key prototype)
+ when (listp infos)
+ do (loop for info in infos
+ for name = (modular-fun-info-name info)
+ and width = (modular-fun-info-width info)
+ and lambda-list = (modular-fun-info-lambda-list info)
+ do (forms (definition name lambda-list prototype width)))))
+ `(progn ,@(forms)))
+
+#!+#.(cl:if (cl:= sb!vm:n-machine-word-bits 32) '(and) '(or))
+(defun sb!vm::ash-left-mod32 (integer amount)
+ (ldb (byte 32 0) (ash integer amount)))
+#!+#.(cl:if (cl:= sb!vm:n-machine-word-bits 64) '(and) '(or))
+(defun sb!vm::ash-left-mod64 (integer amount)
+ (ldb (byte 64 0) (ash integer amount)))
+#!+x86
+(defun sb!vm::ash-left-smod30 (integer amount)
+ (mask-signed-field 30 (ash integer amount)))
+#!+x86-64
+(defun sb!vm::ash-left-smod61 (integer amount)
+ (mask-signed-field 61 (ash integer amount)))
+
;; function arguments. -- WHN 19990918
(not (ir1-attributep attr call))
(every #'constant-lvar-p args)
- (node-lvar node)
- ;; Even if the function is foldable in principle,
- ;; it might be one of our low-level
- ;; implementation-specific functions. Such
- ;; functions don't necessarily exist at runtime on
- ;; a plain vanilla ANSI Common Lisp
- ;; cross-compilation host, in which case the
- ;; cross-compiler can't fold it because the
- ;; cross-compiler doesn't know how to evaluate it.
- #+sb-xc-host
- (or (fboundp (combination-fun-source-name node))
- (progn (format t ";;; !!! Unbound fun: (~S~{ ~S~})~%"
- (combination-fun-source-name node)
- (mapcar #'lvar-value args))
- nil)))
+ (node-lvar node))
(constant-fold-call node)
(return-from ir1-optimize-combination)))