(deposit-field newbyte bytespec integer))
(defun %ldb (size posn integer)
+ (declare (type bit-index size posn))
(logand (ash integer (- posn))
(1- (ash 1 size))))
(defun %mask-field (size posn integer)
+ (declare (type bit-index size posn))
(logand integer (ash (1- (ash 1 size)) posn)))
(defun %dpb (newbyte size posn integer)
+ (declare (type bit-index size posn))
(let ((mask (1- (ash 1 size))))
(logior (logand integer (lognot (ash mask posn)))
(ash (logand newbyte mask) posn))))
(defun %deposit-field (newbyte size posn integer)
+ (declare (type bit-index size posn))
(let ((mask (ash (ldb (byte size 0) -1) posn)))
(logior (logand newbyte mask)
(logand integer (lognot mask)))))
(logior x ,k)))))
(loop for x from min upto max do
(assert (eql (logior x k) (funcall f x)))))))))
+
+(with-test (:name :ldb-negative-index-no-error)
+ (assert
+ (raises-error?
+ (funcall (compile nil
+ `(lambda (x y)
+ (ldb (byte x y) 100)))
+ -1 -2)))
+ (assert
+ (raises-error?
+ (funcall (compile nil
+ `(lambda (x y)
+ (mask-field (byte x y) 100)))
+ -1 -2)))
+ (assert
+ (raises-error?
+ (funcall (compile nil
+ `(lambda (x y)
+ (dpb 0 (byte x y) 100)))
+ -1 -2)))
+ (assert
+ (raises-error?
+ (funcall (compile nil
+ `(lambda (x y)
+ (deposit-field 0 (byte x y) 100)))
+ -1 -2))))