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)
|