X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fcross-float.lisp;h=e7236c1dd8b92f49bea4f119dc09d6bb29cc488f;hb=02c9007b4ca5753406f60019f4fe5e5f8392541a;hp=2a9389a0bbe3cce62352754c797c1c53a2c4096b;hpb=a8fa26a6e9804d3548f5bca9361a91345a689099;p=sbcl.git diff --git a/src/code/cross-float.lisp b/src/code/cross-float.lisp index 2a9389a..e7236c1 100644 --- a/src/code/cross-float.lisp +++ b/src/code/cross-float.lisp @@ -77,7 +77,13 @@ (if (plusp exponent) ; if not obviously denormalized (do () (nil) - (cond (;; ordinary termination case + (cond (;; special termination case, denormalized + ;; float number + (zerop exponent) + ;; Denormalized numbers have exponent one + ;; greater than the exponent field. + (return (ash significand -1))) + (;; ordinary termination case (>= significand (expt 2 23)) (assert (< 0 significand (expt 2 24))) ;; Exponent 0 is reserved for @@ -87,12 +93,7 @@ (return (logior (ash exponent 23) (logand significand (1- (ash 1 23)))))) - (;; special termination case, denormalized - ;; float number - (zerop exponent) - ;; Denormalized numbers have exponent one - ;; greater than the exponent field. - (return (ash significand -1))) + (t ;; Shift as necessary to set bit 24 of ;; significand. @@ -111,6 +112,7 @@ (ecase lisp-sign (1 unsigned-result) (-1 (logior unsigned-result (- (expt 2 31))))))))) + (defun double-float-bits (x) (declare (type double-float x)) (assert (= (float-radix x) 2)) @@ -126,7 +128,13 @@ (if (plusp exponent) ; if not obviously denormalized (do () (nil) - (cond (;; ordinary termination case + (cond (;; special termination case, denormalized + ;; float number + (zerop exponent) + ;; Denormalized numbers have exponent one + ;; greater than the exponent field. + (return (ash significand -1))) + (;; ordinary termination case (>= significand (expt 2 52)) (assert (< 0 significand (expt 2 53))) ;; Exponent 0 is reserved for @@ -136,12 +144,6 @@ (return (logior (ash exponent 52) (logand significand (1- (ash 1 52)))))) - (;; special termination case, denormalized - ;; float number - (zerop exponent) - ;; Denormalized numbers have exponent one - ;; greater than the exponent field. - (return (ash significand -1))) (t ;; Shift as necessary to set bit 53 of ;; significand. @@ -160,6 +162,7 @@ (ecase lisp-sign (1 unsigned-result) (-1 (logior unsigned-result (- (expt 2 63))))))))) + (defun double-float-low-bits (x) (declare (type double-float x)) (if (zerop x) @@ -170,6 +173,7 @@ ;; would be nice to make the family of functions have a more ;; consistent return convention. (logand #xffffffff (double-float-bits x)))) + (defun double-float-high-bits (x) (declare (type double-float x)) (if (zerop x) @@ -181,10 +185,9 @@ ;;; when trying to optimize the EXPT forms in the MAKE-FOO-FLOAT ;;; functions below. See the message ;;; Subject: Re: Compiler bug? -;;; From: Raymond Toy +;;; From: Raymond Toy ;;; Date: 28 Mar 2001 08:19:59 -0500 -;;; Message-ID: <4nvgou3u9s.fsf@rtp.ericsson.se> -;;; on the cmucl-imp@cons.org mailing list. Once the CMU CL folks +;;; on the cmucl-imp mailing list. Once the CMU CL folks ;;; make a bug-fix release, we can get rid of this and go back to ;;; calling EXPT directly. -- WHN 2001-04-05 (defun kludge-opaque-expt (x y) @@ -199,9 +202,9 @@ ;;; a problem, there are possible workarounds involving portable ;;; representations for target floating point numbers, like ;;; (DEFSTRUCT TARGET-SINGLE-FLOAT -;;; (SIGN (REQUIRED-ARGUMENT) :TYPE BIT) -;;; (EXPONENT (REQUIRED-ARGUMENT) :TYPE UNSIGNED-BYTE) -;;; (MANTISSA (REQUIRED-ARGUMENT) :TYPE UNSIGNED-BYTE)) +;;; (SIGN (MISSING-ARG) :TYPE BIT) +;;; (EXPONENT (MISSING-ARG) :TYPE UNSIGNED-BYTE) +;;; (MANTISSA (MISSING-ARG) :TYPE UNSIGNED-BYTE)) ;;; with some sort of MAKE-LOAD-FORM-ish magic to cause them to be ;;; written out in the appropriate target format. (And yes, those ;;; workarounds *do* look messy to me, which is why I just went @@ -217,6 +220,7 @@ (ash 1 23)) (expt 0.5 23)))) (* sign (kludge-opaque-expt 2.0 expt) mant)))) + (defun make-double-float (hi lo) (if (and (zerop hi) (zerop lo)) ; IEEE float special case 0.0d0