From: Christophe R. <cr...@us...> - 2009-08-26 20:58:00
|
Update of /cvsroot/sbcl/sbcl/src/code In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv21479/src/code Modified Files: float.lisp Log Message: 1.0.30.54: Fix a cross-compiler leak in specialized %unary-truncate Don't use host values of most-fooative fixnum. (Also expand on the comment about using an exclusive test for floats within the fixnum range) Index: float.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/code/float.lisp,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- float.lisp 6 Aug 2009 12:52:58 -0000 1.28 +++ float.lisp 26 Aug 2009 20:57:49 -0000 1.29 @@ -753,10 +753,13 @@ ;;; *not* return the second value of truncate, so it must be computed by the ;;; caller if needed. ;;; -;;; In the float case, we pick off small arguments so that compiler can use -;;; special-case operations. We use an exclusive test, since (due to round-off -;;; error), (float most-positive-fixnum) may be greater than -;;; most-positive-fixnum. +;;; In the float case, we pick off small arguments so that compiler +;;; can use special-case operations. We use an exclusive test, since +;;; (due to round-off error), (float most-positive-fixnum) is likely +;;; to be equal to (1+ most-positive-fixnum). An exclusive test is +;;; good enough, because most-positive-fixnum will be one less than a +;;; power of two, and that power of two will be exactly representable +;;; as a float (at least until we get 128-bit fixnums). (defun %unary-truncate (number) (number-dispatch ((number real)) ((integer) number) @@ -775,9 +778,9 @@ ;;; Specialized versions for floats. (macrolet ((def (type name) `(defun ,name (number) - (if (< ,(coerce most-negative-fixnum type) + (if (< ,(coerce sb!xc:most-negative-fixnum type) number - ,(coerce most-positive-fixnum type)) + ,(coerce sb!xc:most-positive-fixnum type)) (truly-the fixnum (,name number)) ;; General -- slow -- case. (multiple-value-bind (bits exp) (integer-decode-float number) |