1 ;;;; bit-operations.test --- bitwise operations on numbers -*- scheme -*-
2 ;;;; Copyright (C) 2000, 2001, 2003, 2006 Free Software Foundation, Inc.
4 ;;;; This library is free software; you can redistribute it and/or
5 ;;;; modify it under the terms of the GNU Lesser General Public
6 ;;;; License as published by the Free Software Foundation; either
7 ;;;; version 2.1 of the License, or (at your option) any later version.
9 ;;;; This library is distributed in the hope that it will be useful,
10 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ;;;; Lesser General Public License for more details.
14 ;;;; You should have received a copy of the GNU Lesser General Public
15 ;;;; License along with this library; if not, write to the Free Software
16 ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 (use-modules (test-suite lib)
19 (ice-9 documentation))
26 (define (run-tests name-proc test-proc arg-sets)
29 (pass-if (apply name-proc arg-set)
30 (apply test-proc arg-set)))
33 (define (documented? object)
34 (not (not (object-documentation object))))
37 (inexact->exact (round (+ (/ (log (+ most-positive-fixnum 1)) (log 2)) 1))))
39 (define fixnum-min most-negative-fixnum)
40 (define fixnum-max most-positive-fixnum)
42 (with-test-prefix "bit-extract"
44 (pass-if "documented?"
45 (documented? bit-extract))
47 (with-test-prefix "extract from zero"
51 (string-append "single bit " (number->string b)))
53 (= (bit-extract a b c) d))
57 (list 0 (+ fixnum-bit -2) (+ fixnum-bit -1) 0)
58 (list 0 (+ fixnum-bit -1) (+ fixnum-bit 0) 0)
59 (list 0 (+ fixnum-bit 0) (+ fixnum-bit 1) 0)
60 (list 0 (+ fixnum-bit 1) (+ fixnum-bit 2) 0)))
64 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
66 (= (bit-extract a b c) d))
68 (list 0 0 (+ fixnum-bit -1) 0)
69 (list 0 1 (+ fixnum-bit 0) 0)
70 (list 0 2 (+ fixnum-bit 1) 0)
71 (list 0 (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -3) 0)
72 (list 0 (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -2) 0)
73 (list 0 (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit -1) 0)
74 (list 0 (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 0) 0)))
78 (string-append "fixnum-bit bits starting at " (number->string b)))
80 (= (bit-extract a b c) d))
82 (list 0 0 (+ fixnum-bit 0) 0)
83 (list 0 1 (+ fixnum-bit 1) 0)
84 (list 0 2 (+ fixnum-bit 2) 0)
85 (list 0 (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -2) 0)
86 (list 0 (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -1) 0)
87 (list 0 (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 0) 0)
88 (list 0 (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 1) 0)))
92 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
94 (= (bit-extract a b c) d))
96 (list 0 0 (+ fixnum-bit 1) 0)
97 (list 0 1 (+ fixnum-bit 2) 0)
98 (list 0 2 (+ fixnum-bit 3) 0)
99 (list 0 (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -1) 0)
100 (list 0 (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit 0) 0)
101 (list 0 (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 1) 0)
102 (list 0 (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 2) 0))))
104 (with-test-prefix "extract from fixnum-max"
108 (string-append "single bit " (number->string b)))
110 (= (bit-extract a b c) d))
112 (list fixnum-max 0 1 1)
113 (list fixnum-max 1 2 1)
114 (list fixnum-max (+ fixnum-bit -2) (+ fixnum-bit -1) 1)
115 (list fixnum-max (+ fixnum-bit -1) (+ fixnum-bit 0) 0)
116 (list fixnum-max (+ fixnum-bit 0) (+ fixnum-bit 1) 0)
117 (list fixnum-max (+ fixnum-bit 1) (+ fixnum-bit 2) 0)))
121 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
123 (= (bit-extract a b c) d))
125 (list fixnum-max 0 (+ fixnum-bit -1) (ash fixnum-max 0))
126 (list fixnum-max 1 (+ fixnum-bit 0) (ash fixnum-max -1))
127 (list fixnum-max 2 (+ fixnum-bit 1) (ash fixnum-max -2))
128 (list fixnum-max (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -3) 1)
129 (list fixnum-max (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -2) 0)
130 (list fixnum-max (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit -1) 0)
131 (list fixnum-max (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 0) 0)))
135 (string-append "fixnum-bit bits starting at " (number->string b)))
137 (= (bit-extract a b c) d))
139 (list fixnum-max 0 (+ fixnum-bit 0) (ash fixnum-max 0))
140 (list fixnum-max 1 (+ fixnum-bit 1) (ash fixnum-max -1))
141 (list fixnum-max 2 (+ fixnum-bit 2) (ash fixnum-max -2))
142 (list fixnum-max (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -2) 1)
143 (list fixnum-max (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -1) 0)
144 (list fixnum-max (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 0) 0)
145 (list fixnum-max (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 1) 0)))
149 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
151 (= (bit-extract a b c) d))
153 (list fixnum-max 0 (+ fixnum-bit 1) (ash fixnum-max 0))
154 (list fixnum-max 1 (+ fixnum-bit 2) (ash fixnum-max -1))
155 (list fixnum-max 2 (+ fixnum-bit 3) (ash fixnum-max -2))
156 (list fixnum-max (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -1) 1)
157 (list fixnum-max (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit 0) 0)
158 (list fixnum-max (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 1) 0)
159 (list fixnum-max (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 2) 0))))
161 (with-test-prefix "extract from fixnum-max + 1"
165 (string-append "single bit " (number->string b)))
167 (= (bit-extract a b c) d))
169 (list (+ fixnum-max 1) 0 1 0)
170 (list (+ fixnum-max 1) 1 2 0)
171 (list (+ fixnum-max 1) (+ fixnum-bit -2) (+ fixnum-bit -1) 0)
172 (list (+ fixnum-max 1) (+ fixnum-bit -1) (+ fixnum-bit 0) 1)
173 (list (+ fixnum-max 1) (+ fixnum-bit 0) (+ fixnum-bit 1) 0)
174 (list (+ fixnum-max 1) (+ fixnum-bit 1) (+ fixnum-bit 2) 0)))
178 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
180 (= (bit-extract a b c) d))
182 (list (+ fixnum-max 1) 0 (+ fixnum-bit -1) (ash 0 (- fixnum-bit 1)))
183 (list (+ fixnum-max 1) 1 (+ fixnum-bit 0) (ash 1 (- fixnum-bit 2)))
184 (list (+ fixnum-max 1) 2 (+ fixnum-bit 1) (ash 1 (- fixnum-bit 3)))
185 (list (+ fixnum-max 1) (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -3) 2)
186 (list (+ fixnum-max 1) (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -2) 1)
187 (list (+ fixnum-max 1) (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit -1) 0)
188 (list (+ fixnum-max 1) (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 0) 0)))
192 (string-append "fixnum-bit bits starting at " (number->string b)))
194 (= (bit-extract a b c) d))
196 (list (+ fixnum-max 1) 0 (+ fixnum-bit 0) (ash 1 (- fixnum-bit 1)))
197 (list (+ fixnum-max 1) 1 (+ fixnum-bit 1) (ash 1 (- fixnum-bit 2)))
198 (list (+ fixnum-max 1) 2 (+ fixnum-bit 2) (ash 1 (- fixnum-bit 3)))
199 (list (+ fixnum-max 1) (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -2) 2)
200 (list (+ fixnum-max 1) (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -1) 1)
201 (list (+ fixnum-max 1) (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 0) 0)
202 (list (+ fixnum-max 1) (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 1) 0)))
206 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
208 (= (bit-extract a b c) d))
210 (list (+ fixnum-max 1) 0 (+ fixnum-bit 1) (ash 1 (- fixnum-bit 1)))
211 (list (+ fixnum-max 1) 1 (+ fixnum-bit 2) (ash 1 (- fixnum-bit 2)))
212 (list (+ fixnum-max 1) 2 (+ fixnum-bit 3) (ash 1 (- fixnum-bit 3)))
213 (list (+ fixnum-max 1) (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -1) 2)
214 (list (+ fixnum-max 1) (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit 0) 1)
215 (list (+ fixnum-max 1) (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 1) 0)
216 (list (+ fixnum-max 1) (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 2) 0))))
218 (with-test-prefix "extract from fixnum-min"
222 (string-append "single bit " (number->string b)))
224 (= (bit-extract a b c) d))
226 (list fixnum-min 0 1 0)
227 (list fixnum-min 1 2 0)
228 (list fixnum-min (+ fixnum-bit -2) (+ fixnum-bit -1) 0)
229 (list fixnum-min (+ fixnum-bit -1) (+ fixnum-bit 0) 1)
230 (list fixnum-min (+ fixnum-bit 0) (+ fixnum-bit 1) 1)
231 (list fixnum-min (+ fixnum-bit 1) (+ fixnum-bit 2) 1)))
235 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
237 (= (bit-extract a b c) d))
239 (list fixnum-min 0 (+ fixnum-bit -1) (ash 0 (- fixnum-bit 1)))
240 (list fixnum-min 1 (+ fixnum-bit 0) (ash 1 (- fixnum-bit 2)))
241 (list fixnum-min 2 (+ fixnum-bit 1) (ash 3 (- fixnum-bit 3)))
242 (list fixnum-min (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -3)
243 (- (ash 1 (- fixnum-bit 1)) 2))
244 (list fixnum-min (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -2)
245 (- (ash 1 (- fixnum-bit 1)) 1))
246 (list fixnum-min (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit -1)
247 (- (ash 1 (- fixnum-bit 1)) 1))
248 (list fixnum-min (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 0)
249 (- (ash 1 (- fixnum-bit 1)) 1))))
253 (string-append "fixnum-bit bits starting at " (number->string b)))
255 (= (bit-extract a b c) d))
257 (list fixnum-min 0 (+ fixnum-bit 0) (ash 1 (- fixnum-bit 1)))
258 (list fixnum-min 1 (+ fixnum-bit 1) (ash 3 (- fixnum-bit 2)))
259 (list fixnum-min 2 (+ fixnum-bit 2) (ash 7 (- fixnum-bit 3)))
260 (list fixnum-min (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -2)
261 (- (ash 1 fixnum-bit) 2))
262 (list fixnum-min (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit -1)
263 (- (ash 1 fixnum-bit) 1))
264 (list fixnum-min (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 0)
265 (- (ash 1 fixnum-bit) 1))
266 (list fixnum-min (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 1)
267 (- (ash 1 fixnum-bit) 1))))
271 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
273 (= (bit-extract a b c) d))
275 (list fixnum-min 0 (+ fixnum-bit 1) (ash 3 (- fixnum-bit 1)))
276 (list fixnum-min 1 (+ fixnum-bit 2) (ash 7 (- fixnum-bit 2)))
277 (list fixnum-min 2 (+ fixnum-bit 3) (ash 15 (- fixnum-bit 3)))
278 (list fixnum-min (+ fixnum-bit -2) (+ fixnum-bit fixnum-bit -1)
279 (- (ash 1 (+ fixnum-bit 1)) 2))
280 (list fixnum-min (+ fixnum-bit -1) (+ fixnum-bit fixnum-bit 0)
281 (- (ash 1 (+ fixnum-bit 1)) 1))
282 (list fixnum-min (+ fixnum-bit 0) (+ fixnum-bit fixnum-bit 1)
283 (- (ash 1 (+ fixnum-bit 1)) 1))
284 (list fixnum-min (+ fixnum-bit 1) (+ fixnum-bit fixnum-bit 2)
285 (- (ash 1 (+ fixnum-bit 1)) 1)))))
287 (with-test-prefix "extract from fixnum-min - 1"
291 (string-append "single bit " (number->string b)))
293 (= (bit-extract a b c) d))
295 (list (- fixnum-min 1) 0 1 1)
296 (list (- fixnum-min 1) 1 2 1)
297 (list (- fixnum-min 1) (+ fixnum-bit -2) (+ fixnum-bit -1) 1)
298 (list (- fixnum-min 1) (+ fixnum-bit -1) (+ fixnum-bit 0) 0)
299 (list (- fixnum-min 1) (+ fixnum-bit 0) (+ fixnum-bit 1) 1)
300 (list (- fixnum-min 1) (+ fixnum-bit 1) (+ fixnum-bit 2) 1)))
304 (string-append "fixnum-bit - 1 bits starting at " (number->string b)))
306 (= (bit-extract a b c) d))
308 (list (- fixnum-min 1) 0 (+ fixnum-bit -1)
309 (- (ash 1 (- fixnum-bit 1)) 1 (ash 0 (- fixnum-bit 1))))
310 (list (- fixnum-min 1) 1 (+ fixnum-bit 0)
311 (- (ash 1 (- fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 2))))
312 (list (- fixnum-min 1) 2 (+ fixnum-bit 1)
313 (- (ash 1 (- fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 3))))
314 (list (- fixnum-min 1) (+ fixnum-bit -2)
315 (+ fixnum-bit fixnum-bit -3) (- (ash 1 (- fixnum-bit 1)) 3))
316 (list (- fixnum-min 1) (+ fixnum-bit -1)
317 (+ fixnum-bit fixnum-bit -2) (- (ash 1 (- fixnum-bit 1)) 2))
318 (list (- fixnum-min 1) (+ fixnum-bit 0)
319 (+ fixnum-bit fixnum-bit -1) (- (ash 1 (- fixnum-bit 1)) 1))
320 (list (- fixnum-min 1) (+ fixnum-bit 1)
321 (+ fixnum-bit fixnum-bit 0) (- (ash 1 (- fixnum-bit 1)) 1))))
325 (string-append "fixnum-bit bits starting at " (number->string b)))
327 (= (bit-extract a b c) d))
329 (list (- fixnum-min 1) 0 (+ fixnum-bit 0)
330 (- (ash 1 fixnum-bit) 1 (ash 1 (- fixnum-bit 1))))
331 (list (- fixnum-min 1) 1 (+ fixnum-bit 1)
332 (- (ash 1 fixnum-bit) 1 (ash 1 (- fixnum-bit 2))))
333 (list (- fixnum-min 1) 2 (+ fixnum-bit 2)
334 (- (ash 1 fixnum-bit) 1 (ash 1 (- fixnum-bit 3))))
335 (list (- fixnum-min 1) (+ fixnum-bit -2)
336 (+ fixnum-bit fixnum-bit -2) (- (ash 1 fixnum-bit) 3))
337 (list (- fixnum-min 1) (+ fixnum-bit -1)
338 (+ fixnum-bit fixnum-bit -1) (- (ash 1 fixnum-bit) 2))
339 (list (- fixnum-min 1) (+ fixnum-bit 0)
340 (+ fixnum-bit fixnum-bit 0) (- (ash 1 fixnum-bit) 1))
341 (list (- fixnum-min 1) (+ fixnum-bit 1)
342 (+ fixnum-bit fixnum-bit 1) (- (ash 1 fixnum-bit) 1))))
346 (string-append "fixnum-bit + 1 bits starting at " (number->string b)))
348 (= (bit-extract a b c) d))
350 (list (- fixnum-min 1) 0 (+ fixnum-bit 1)
351 (- (ash 1 (+ fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 1))))
352 (list (- fixnum-min 1) 1 (+ fixnum-bit 2)
353 (- (ash 1 (+ fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 2))))
354 (list (- fixnum-min 1) 2 (+ fixnum-bit 3)
355 (- (ash 1 (+ fixnum-bit 1)) 1 (ash 1 (- fixnum-bit 3))))
356 (list (- fixnum-min 1) (+ fixnum-bit -2)
357 (+ fixnum-bit fixnum-bit -1) (- (ash 1 (+ fixnum-bit 1)) 3))
358 (list (- fixnum-min 1) (+ fixnum-bit -1)
359 (+ fixnum-bit fixnum-bit 0) (- (ash 1 (+ fixnum-bit 1)) 2))
360 (list (- fixnum-min 1) (+ fixnum-bit 0)
361 (+ fixnum-bit fixnum-bit 1) (- (ash 1 (+ fixnum-bit 1)) 1))
362 (list (- fixnum-min 1) (+ fixnum-bit 1)
363 (+ fixnum-bit fixnum-bit 2) (- (ash 1 (+ fixnum-bit 1)) 1))))))