0.8.18.14:
[sbcl.git] / src / code / bignum.lisp
index d05a6fa..86656c7 100644 (file)
   (declare (optimize #-sb-xc-host (sb!ext:inhibit-warnings 3)))
   (let ((res (dpb exp
                  sb!vm:single-float-exponent-byte
-                 (logandc2 (sb!ext:truly-the (unsigned-byte #.(1- sb!vm:n-word-bits))
-                                             (%bignum-ref bits 1))
+                 (logandc2 (logand #xffffffff
+                                   (%bignum-ref bits 1))
                            sb!vm:single-float-hidden-bit))))
     (make-single-float
      (if plusp
   (declare (optimize #-sb-xc-host (sb!ext:inhibit-warnings 3)))
   (let ((hi (dpb exp
                 sb!vm:double-float-exponent-byte
-                (logandc2 (sb!ext:truly-the (unsigned-byte #.(1- sb!vm:n-word-bits))
-                                            (%bignum-ref bits 2))
-                          sb!vm:double-float-hidden-bit))))
-    (make-double-float
-     (if plusp
-        hi
-        (logior hi (ash -1 sb!vm:float-sign-shift)))
-     (%bignum-ref bits 1))))
+                (logandc2 (ecase sb!vm::n-word-bits
+                            (32 (%bignum-ref bits 2))
+                            (64 (ash (%bignum-ref bits 1) -32)))
+                          sb!vm:double-float-hidden-bit)))
+       (lo (logand #xffffffff (%bignum-ref bits 1))))
+    (make-double-float (if plusp
+                          hi
+                          (logior hi (ash -1 sb!vm:float-sign-shift)))
+                      lo)))
 #!+(and long-float x86)
 (defun long-float-from-bits (bits exp plusp)
   (declare (fixnum exp))