(end-1 (+ sb!vm:vector-data-offset
(floor (1- length) sb!vm:n-word-bits))))
((= i end-1)
- (let* ((extra (mod length sb!vm:n-word-bits))
- (mask (1- (ash 1 extra)))
+ (let* ((extra (1+ (mod (1- length) sb!vm:n-word-bits)))
+ (mask (ash #.(1- (ash 1 sb!vm:n-word-bits))
+ (- extra sb!vm:n-word-bits)))
(numx
(logand
(ash mask
(:big-endian
'(- sb!vm:n-word-bits extra))))
(%raw-bits y i))))
- (declare (type (mod #.sb!vm:n-word-bits)
- extra)
+ (declare (type (integer 1 #.sb!vm:n-word-bits) extra)
(type sb!vm:word mask numx numy))
(= numx numy)))
(declare (type index i end-1))
(truncate (truly-the index (1- length))
sb!vm:n-word-bits))))
((= index end-1)
- (let* ((extra (mod length sb!vm:n-word-bits))
- (mask (1- (ash 1 extra)))
+ (let* ((extra (1+ (mod (1- length) sb!vm:n-word-bits)))
+ (mask (ash #.(1- (ash 1 sb!vm:n-word-bits))
+ (- extra sb!vm:n-word-bits)))
(bits (logand (ash mask
,(ecase sb!c:*backend-byte-order*
(:little-endian 0)
(:big-endian
'(- sb!vm:n-word-bits extra))))
(%raw-bits sequence index))))
- (declare (type (mod #.sb!vm:n-word-bits) extra))
+ (declare (type (integer 1 #.sb!vm:n-word-bits) extra))
(declare (type sb!vm:word mask bits))
;; could consider LOGNOT for the zero case instead of
;; doing the subtraction...
#!+x86 (def sb!vm::ash-left-smod30 :signed 30)
(def sb!vm::ash-left-mod32 :unsigned 32))
#!+#.(cl:if (cl:= 64 sb!vm:n-machine-word-bits) '(and) '(or))
- (def sb!vm::ash-left-mod64 :unsigned 64))
+ (progn
+ #!+x86-64 (def sb!vm::ash-left-smod61 :signed 61)
+ (def sb!vm::ash-left-mod64 :unsigned 64)))
\f
;;;; word-wise logical operations