fix ROTATE-BYTE on 64-bit words using constant negative rotation
[sbcl.git] / contrib / sb-rotate-byte / rotate-byte-tests.lisp
1 (in-package "SB-ROTATE-BYTE")
2
3 ;;; Ensure we don't bug out with an identity rotation.
4 (assert (= (rotate-byte 0 (byte 32 0) 3) 3))
5
6 (assert (= (rotate-byte 3 (byte 32 0) 3) 24))
7 (assert (= (rotate-byte 3 (byte 16 0) 3) 24))
8 (assert (= (rotate-byte 3 (byte 2 0) 3) 3))
9 (assert (= (rotate-byte 3 (byte 5 5) 3) 3))
10 (assert (= (rotate-byte 6 (byte 8 0) -3) -129))
11
12 (flet ((opaque-identity (x) x))
13   (declare (notinline opaque-identity))
14   (assert (= (rotate-byte 3 (opaque-identity (byte 32 0)) 3) 24))
15   (assert (= (rotate-byte 3 (opaque-identity (byte 16 0)) 3) 24))
16   (assert (= (rotate-byte 3 (opaque-identity (byte 2 0)) 3) 3))
17   (assert (= (rotate-byte 3 (opaque-identity (byte 5 5)) 3) 3))
18   (assert (= (rotate-byte 6 (opaque-identity (byte 8 0)) -3) -129)))
19
20 (defun pfixnum/c (integer)
21   (declare (type (unsigned-byte 29) integer))
22   (rotate-byte 5 (byte 32 0) integer))
23
24 (assert (= (pfixnum/c 5) 160))
25 (assert (= (pfixnum/c 1) 32))
26 (assert (= (pfixnum/c (ash 1 26)) (ash 1 31)))
27 (assert (= (pfixnum/c (ash 1 27)) 1))
28
29 (defun pfixnum (count integer)
30   (declare (type (unsigned-byte 29) integer)
31            (type (integer -31 31) count))
32   (rotate-byte count (byte 32 0) integer))
33
34 (assert (= (pfixnum 5 5) 160))
35 (assert (= (pfixnum 5 1) 32))
36 (assert (= (pfixnum 5 (ash 1 26)) (ash 1 31)))
37 (assert (= (pfixnum 5 (ash 1 27)) 1))
38
39 (defun ub32/c (integer)
40   (declare (type (unsigned-byte 32) integer))
41   (rotate-byte 5 (byte 32 0) integer))
42
43 (assert (= (ub32/c 5) 160))
44 (assert (= (ub32/c 1) 32))
45 (assert (= (ub32/c (ash 1 26)) (ash 1 31)))
46 (assert (= (ub32/c (ash 1 27)) 1))
47
48 (defun ub32 (count integer)
49   (declare (type (unsigned-byte 32) integer)
50            (type (integer -31 31) count))
51   (rotate-byte count (byte 32 0) integer))
52
53 (assert (= (ub32 5 5) 160))
54 (assert (= (ub32 5 1) 32))
55 (assert (= (ub32 5 (ash 1 26)) (ash 1 31)))
56 (assert (= (ub32 5 (ash 1 27)) 1))
57
58 ;;; test with (contrived) register pressure on the x86 to ensure that the
59 ;;; rotatee doesn't get clobbered by the count.
60
61 (defun ub32-reg-pressure (count integer)
62   (declare (type (unsigned-byte 32) integer)
63            (type (integer -31 31) count))
64   (rotate-byte count (byte 32 0) (ldb (byte 32 0) (+ (* 67 count)
65                                                      integer))))
66
67 (assert (= (ub32-reg-pressure 1 5) 144))
68 (assert (= (ub32-reg-pressure 5 5) 10880))
69 (assert (= (ub32-reg-pressure 5 (ash 1 26)) 2147494368))
70 (assert (= (ub32-reg-pressure 5 (ash 1 27)) 10721))
71
72 (defun ub64/c (integer)
73   (declare (type (unsigned-byte 64) integer))
74   (rotate-byte 6 (byte 64 0) integer))
75
76 (defun ub64/-c (integer)
77   (declare (type (unsigned-byte 64) integer))
78   (rotate-byte -6 (byte 64 0) integer))
79
80 (assert (= (ub64/-c 320) 5))
81 (assert (= (ub64/-c 64) 1))
82 (assert (= (ub64/-c (ash 1 63)) (ash 1 57)))
83 (assert (= (ub64/-c 1) (ash 1 58)))
84
85 (defun ub64 (count integer)
86   (declare (type (unsigned-byte 64) integer)
87            (type (integer -63 63) count))
88   (rotate-byte count (byte 64 0) integer))
89
90 (assert (= (ub64 6 5) 320))
91 (assert (= (ub64 6 1) 64))
92 (assert (= (ub64 6 (ash 1 57)) (ash 1 63)))
93 (assert (= (ub64 6 (ash 1 58)) 1))