1 (in-package "SB-ROTATE-BYTE")
3 (assert (= (rotate-byte 3 (byte 32 0) 3) 24))
4 (assert (= (rotate-byte 3 (byte 16 0) 3) 24))
5 (assert (= (rotate-byte 3 (byte 2 0) 3) 3))
6 (assert (= (rotate-byte 3 (byte 5 5) 3) 3))
7 (assert (= (rotate-byte 6 (byte 8 0) -
3) -
129))
9 (flet ((opaque-identity (x) x
))
10 (declare (notinline opaque-identity
))
11 (assert (= (rotate-byte 3 (opaque-identity (byte 32 0)) 3) 24))
12 (assert (= (rotate-byte 3 (opaque-identity (byte 16 0)) 3) 24))
13 (assert (= (rotate-byte 3 (opaque-identity (byte 2 0)) 3) 3))
14 (assert (= (rotate-byte 3 (opaque-identity (byte 5 5)) 3) 3))
15 (assert (= (rotate-byte 6 (opaque-identity (byte 8 0)) -
3) -
129)))
17 (defun pfixnum/c
(integer)
18 (declare (type (unsigned-byte 29) integer
))
19 (rotate-byte 5 (byte 32 0) integer
))
21 (assert (= (pfixnum/c
5) 160))
22 (assert (= (pfixnum/c
1) 32))
23 (assert (= (pfixnum/c
(ash 1 26)) (ash 1 31)))
24 (assert (= (pfixnum/c
(ash 1 27)) 1))
26 (defun pfixnum (count integer
)
27 (declare (type (unsigned-byte 29) integer
)
28 (type (integer -
31 31) count
))
29 (rotate-byte count
(byte 32 0) integer
))
31 (assert (= (pfixnum 5 5) 160))
32 (assert (= (pfixnum 5 1) 32))
33 (assert (= (pfixnum 5 (ash 1 26)) (ash 1 31)))
34 (assert (= (pfixnum 5 (ash 1 27)) 1))
36 (defun ub32/c
(integer)
37 (declare (type (unsigned-byte 32) integer
))
38 (rotate-byte 5 (byte 32 0) integer
))
40 (assert (= (ub32/c
5) 160))
41 (assert (= (ub32/c
1) 32))
42 (assert (= (ub32/c
(ash 1 26)) (ash 1 31)))
43 (assert (= (ub32/c
(ash 1 27)) 1))
45 (defun ub32 (count integer
)
46 (declare (type (unsigned-byte 32) integer
)
47 (type (integer -
31 31) count
))
48 (rotate-byte count
(byte 32 0) integer
))
50 (assert (= (ub32 5 5) 160))
51 (assert (= (ub32 5 1) 32))
52 (assert (= (ub32 5 (ash 1 26)) (ash 1 31)))
53 (assert (= (ub32 5 (ash 1 27)) 1))
55 ;;; test with (contrived) register pressure on the x86 to ensure that the
56 ;;; rotatee doesn't get clobbered by the count.
58 (defun ub32-reg-pressure (count integer
)
59 (declare (type (unsigned-byte 32) integer
)
60 (type (integer -
31 31) count
))
61 (rotate-byte count
(byte 32 0) (ldb (byte 32 0) (+ (* 67 count
)
64 (assert (= (ub32-reg-pressure 1 5) 144))
65 (assert (= (ub32-reg-pressure 5 5) 10880))
66 (assert (= (ub32-reg-pressure 5 (ash 1 26)) 2147494368))
67 (assert (= (ub32-reg-pressure 5 (ash 1 27)) 10721))