From: Nikodemus S. <de...@us...> - 2009-06-04 18:01:40
|
Update of /cvsroot/sbcl/sbcl/src/compiler In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv14321/src/compiler Modified Files: seqtran.lisp Log Message: 1.0.29.1: fix FILL * Imaginary parts were messed up on 64 bit platforms when filling arrays of (COMPLEX SINGLE-FLOAT). Thanks to Paul Khuong. * Also delay the transform of FILL till constraint propagation has run, to get the constant argument form MAKE-ARRAY in properly. * ...and eradicate remaining references to the SUPPORT file. Index: seqtran.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/seqtran.lisp,v retrieving revision 1.103 retrieving revision 1.104 diff -u -d -r1.103 -r1.104 --- seqtran.lisp 18 May 2009 07:58:11 -0000 1.103 +++ seqtran.lisp 4 Jun 2009 18:01:32 -0000 1.104 @@ -569,40 +569,44 @@ #!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or)) (:complex-single-float (logior (ash (single-float-bits (imagpart tmp)) 32) - (single-float-bits (realpart tmp))))))) + (ldb (byte 32 0) + (single-float-bits (realpart tmp)))))))) (res bits)) (loop for i of-type sb!vm:word from n-bits by n-bits until (= i sb!vm:n-word-bits) do (setf res (ldb (byte sb!vm:n-word-bits 0) (logior res (ash bits i))))) res)) - `(let* ((bits (ldb (byte ,n-bits 0) - ,(ecase kind - (:tagged - `(ash item ,sb!vm:n-fixnum-tag-bits)) - (:char - `(char-code item)) - (:bits - `item) - (:single-float - `(single-float-bits item)) - #!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or)) - (:double-float - `(logior (ash (double-float-high-bits item) 32) - (double-float-low-bits item))) - #!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or)) - (:complex-single-float - `(logior (ash (single-float-bits (imagpart item)) 32) - (single-float-bits (realpart item))))))) - (res bits)) - (declare (type sb!vm:word res)) - ,@(unless (= sb!vm:n-word-bits n-bits) - `((loop for i of-type sb!vm:word from ,n-bits by ,n-bits - until (= i sb!vm:n-word-bits) - do (setf res - (ldb (byte ,sb!vm:n-word-bits 0) - (logior res (ash bits (truly-the (integer 0 ,(- sb!vm:n-word-bits n-bits)) i)))))))) - res)))) + (progn + (delay-ir1-transform node :constraint) + `(let* ((bits (ldb (byte ,n-bits 0) + ,(ecase kind + (:tagged + `(ash item ,sb!vm:n-fixnum-tag-bits)) + (:char + `(char-code item)) + (:bits + `item) + (:single-float + `(single-float-bits item)) + #!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or)) + (:double-float + `(logior (ash (double-float-high-bits item) 32) + (double-float-low-bits item))) + #!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or)) + (:complex-single-float + `(logior (ash (single-float-bits (imagpart item)) 32) + (ldb (byte 32 0) + (single-float-bits (realpart item)))))))) + (res bits)) + (declare (type sb!vm:word res)) + ,@(unless (= sb!vm:n-word-bits n-bits) + `((loop for i of-type sb!vm:word from ,n-bits by ,n-bits + until (= i sb!vm:n-word-bits) + do (setf res + (ldb (byte ,sb!vm:n-word-bits 0) + (logior res (ash bits (truly-the (integer 0 ,(- sb!vm:n-word-bits n-bits)) i)))))))) + res))))) (values `(with-array-data ((data seq) (start start) |