;;;; constants and types
;;; the number of bits to process at a time
-(defconstant unit-bits sb!vm:word-bits)
+(defconstant unit-bits sb!vm:n-word-bits)
;;; the maximum number of bits that can be dealt with in a single call
(defconstant max-bits (ash most-positive-fixnum -2))
#!-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)
+ (* sb!vm:vector-data-offset sb!vm:n-word-bits)
sap
offset
(* (length bv) sb!vm:byte-bits)))