chiark / gitweb /
struct/t/: Use better format for printing `size_t values.
[mLib] / utils / t / bits-testgen.py
1 #! /usr/bin/python
2 ### -*-python-*-
3 ###
4 ### Generate input script and expected output for bit manipulation,
5 ### particularly 64-bit arithmetic.
6
7 import sys as SYS
8 import random as R
9
10 NVEC = 64
11 WD = 64
12 LIMIT = 1 << WD
13 MASK = LIMIT - 1
14
15 SYS.argv.pop()
16 def arg(default = None):
17   if len(SYS.argv):
18     return SYS.argv.pop()
19   else:
20     return default
21
22 R.seed(None)
23 SEED = int(arg(R.randrange(0, 1 << 32)))
24 R.seed(SEED)
25
26 print '### Test vectors for 64-bit arithmetic macros'
27 print '###   [generated; seed = 0x%08x]' % SEED
28
29 def rol(x, n): return ((x << n) | (x >> (WD - n))) & MASK
30 def ror(x, n): return ((x >> n) | (x << (WD - n))) & MASK
31 def put(x): return '%0*x' % (WD/4, x)
32
33 for name, func in [('lsl', lambda x, n: x << n),
34                    ('lsr', lambda x, n: x >> n),
35                    ('rol', rol),
36                    ('ror', ror)]:
37   print '\n%s64 {' % name
38   for i in xrange(NVEC):
39     x = R.randrange(LIMIT)
40     sh = R.randrange(0, 70) & 63
41     print '  %s %2d %s;' % (put(x), sh, put(func(x, sh) & MASK))
42   for i in xrange(4):
43     x = R.randrange(LIMIT)
44     sh = 32
45     print '  %s %2d %s;' % (put(x), sh, put(func(x, sh) & MASK))
46   print '}'
47
48 for name, func in [('add', lambda x, y: x + y),
49                    ('sub', lambda x, y: x - y)]:
50   print '\n%s64 {' % name
51   for i in xrange(NVEC):
52     x = R.randrange(LIMIT)
53     y = R.randrange(LIMIT)
54     print '  %s %s %s;' % (put(x), put(y), put(func(x, y) & MASK))
55   print '}'