0.pre7.4:
[sbcl.git] / src / code / bit-bash.lisp
index 4550787..589968b 100644 (file)
@@ -19,9 +19,6 @@
 ;;; the maximum number of bits that can be dealt with in a single call
 (defconstant max-bits (ash most-positive-fixnum -2))
 
-(eval-when (:compile-toplevel :load-toplevel :execute)
-
-;;; FIXME: Do we really need EVAL-WHEN around the DEFTYPEs?
 (deftype unit ()
   `(unsigned-byte ,unit-bits))
 
@@ -36,8 +33,6 @@
 
 (deftype word-offset ()
   `(integer 0 (,(ceiling max-bits unit-bits))))
-
-) ; EVAL-WHEN
 \f
 ;;;; support routines
 
 #!-sb-fluid (declaim (inline do-unary-bit-bash))
 (defun do-unary-bit-bash (src src-offset dst dst-offset length
                              dst-ref-fn dst-set-fn src-ref-fn)
+  ;; FIXME: Declaring these bit indices to be of type OFFSET, then
+  ;; using the inline expansion in SPEED 3 SAFETY 0 functions, is not
+  ;; a good thing. At the very least, we should make sure that the
+  ;; type (overflow) checks get done. Better would be to avoid
+  ;; using bit indices, and to use 32-bit unsigneds instead, and/or
+  ;; to call out to things like memmove(3) for big moves.
   (declare (type offset src-offset dst-offset length)
           (type function dst-ref-fn dst-set-fn src-ref-fn))
   (multiple-value-bind (dst-word-offset dst-bit-offset)
               (type bit-offset src-bit-offset))
       (cond
        ((<= (+ dst-bit-offset length) unit-bits)
-       ;; We are only writing one word, so it doesn't matter what order
-       ;; we do it in. But we might be reading from multiple words, so take
-       ;; care.
+       ;; We are only writing one word, so it doesn't matter what
+       ;; order we do it in. But we might be reading from multiple
+       ;; words, so take care.
        (cond
         ((zerop length)
          ;; Actually, we aren't even writing one word. This is really easy.
          )
         ((= length unit-bits)
-         ;; DST-BIT-OFFSET must be equal to zero, or we would be writing
-         ;; multiple words. If SRC-BIT-OFFSET is also zero, then we
-         ;; just transfer the single word. Otherwise we have to extract bits
-         ;; from two src words.
+         ;; DST-BIT-OFFSET must be equal to zero, or we would be
+         ;; writing multiple words. If SRC-BIT-OFFSET is also zero,
+         ;; then we just transfer the single word. Otherwise we have
+         ;; to extract bits from two src words.
          (funcall dst-set-fn dst dst-word-offset
                   (if (zerop src-bit-offset)
                       (funcall src-ref-fn src src-word-offset)
                         (funcall src-ref-fn src (1+ src-word-offset))
                         (- src-bit-offset))))))
         (t
-         ;; We are only writing some portion of the dst word, so we need to
-         ;; preserve the extra bits. Also, we still don't know whether we need
-         ;; one or two source words.
+         ;; We are only writing some portion of the dst word, so we
+         ;; need to preserve the extra bits. Also, we still don't
+         ;; know whether we need one or two source words.
          (let ((mask (shift-towards-end (start-mask length) dst-bit-offset))
                (orig (funcall dst-ref-fn dst dst-word-offset))
                (value
                 (if (> src-bit-offset dst-bit-offset)
-                    ;; The source starts further into the word than does
-                    ;; the dst, so the source could extend into the next
-                    ;; word. If it does, we have to merge the two words,
-                    ;; and if not, we can just shift the first word.
+                    ;; The source starts further into the word than
+                    ;; does the dst, so the source could extend into
+                    ;; the next word. If it does, we have to merge
+                    ;; the two words, and if not, we can just shift
+                    ;; the first word.
                     (let ((src-bit-shift (- src-bit-offset dst-bit-offset)))
                       (if (> (+ src-bit-offset length) unit-bits)
                           (32bit-logical-or
                           (shift-towards-start
                            (funcall src-ref-fn src src-word-offset)
                            src-bit-shift)))
-                    ;; The dst starts further into the word than does the
-                    ;; source, so we know the source can not extend into
-                    ;; a second word (or else the dst would too, and we
-                    ;; wouldn't be in this branch.
+                    ;; The dst starts further into the word than does
+                    ;; the source, so we know the source can not
+                    ;; extend into a second word (or else the dst
+                    ;; would too, and we wouldn't be in this branch.
                     (shift-towards-end
                      (funcall src-ref-fn src src-word-offset)
                      (- dst-bit-offset src-bit-offset)))))
                      (32bit-logical-andc2 orig mask)))))))
        ((= src-bit-offset dst-bit-offset)
        ;; The source and dst are aligned, so we don't need to shift
-       ;; anything. But we have to pick the direction of the loop
-       ;; in case the source and dst are really the same thing.
+       ;; anything. But we have to pick the direction of the loop in
+       ;; case the source and dst are really the same thing.
        (multiple-value-bind (words final-bits)
            (floor (+ dst-bit-offset length) unit-bits)
          (declare (type word-offset words) (type bit-offset final-bits))
             ((<= dst-offset src-offset)
              ;; We need to loop from left to right
              (unless (zerop dst-bit-offset)
-               ;; We are only writing part of the first word, so mask off the
-               ;; bits we want to preserve.
+               ;; We are only writing part of the first word, so mask
+               ;; off the bits we want to preserve.
                (let ((mask (end-mask (- dst-bit-offset)))
                      (orig (funcall dst-ref-fn dst dst-word-offset))
                      (value (funcall src-ref-fn src src-word-offset)))
   (declare (type (simple-array (unsigned-byte 8) 1) bv))
   (declare (type sap sap))
   (declare (type fixnum offset))
-  ;; FIXME: Actually it looks as though this, and most other calls
-  ;; to COPY-TO-SYSTEM-AREA, could be written more concisely with BYTE-BLT.
-  ;; Except that the DST-END-DST-START convention for the length is confusing.
-  ;; Perhaps I could rename BYTE-BLT to BYTE-BLIT and replace the
-  ;; DST-END argument with an N-BYTES argument?
+  ;; FIXME: Actually it looks as though this, and most other calls to
+  ;; COPY-TO-SYSTEM-AREA, could be written more concisely with
+  ;; %BYTE-BLT. Except that the DST-END-DST-START convention for the
+  ;; length is confusing. Perhaps I could rename %BYTE-BLT to
+  ;; %BYTE-BLIT (and correspondingly rename the corresponding VOP) and
+  ;; replace the DST-END argument with an N-BYTES argument?
   (copy-to-system-area bv
                       (* sb!vm:vector-data-offset sb!vm:word-bits)
                       sap