Commit | Line | Data |
---|---|---|
7cf5c72a MW |
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 | ||
e243edbc | 15 | ARGS = SYS.argv[1:]; ARGS.reverse() |
7cf5c72a | 16 | def arg(default = None): |
e243edbc MW |
17 | if len(ARGS): return ARGS.pop() |
18 | else: return default | |
7cf5c72a MW |
19 | |
20 | R.seed(None) | |
21 | SEED = int(arg(R.randrange(0, 1 << 32))) | |
22 | R.seed(SEED) | |
23 | ||
24 | print '### Test vectors for 64-bit arithmetic macros' | |
25 | print '### [generated; seed = 0x%08x]' % SEED | |
26 | ||
27 | def rol(x, n): return ((x << n) | (x >> (WD - n))) & MASK | |
28 | def ror(x, n): return ((x >> n) | (x << (WD - n))) & MASK | |
29 | def put(x): return '%0*x' % (WD/4, x) | |
30 | ||
31 | for name, func in [('lsl', lambda x, n: x << n), | |
32 | ('lsr', lambda x, n: x >> n), | |
33 | ('rol', rol), | |
34 | ('ror', ror)]: | |
35 | print '\n%s64 {' % name | |
36 | for i in xrange(NVEC): | |
37 | x = R.randrange(LIMIT) | |
38 | sh = R.randrange(0, 70) & 63 | |
39 | print ' %s %2d %s;' % (put(x), sh, put(func(x, sh) & MASK)) | |
40 | for i in xrange(4): | |
41 | x = R.randrange(LIMIT) | |
42 | sh = 32 | |
43 | print ' %s %2d %s;' % (put(x), sh, put(func(x, sh) & MASK)) | |
44 | print '}' | |
45 | ||
46 | for name, func in [('add', lambda x, y: x + y), | |
47 | ('sub', lambda x, y: x - y)]: | |
48 | print '\n%s64 {' % name | |
49 | for i in xrange(NVEC): | |
50 | x = R.randrange(LIMIT) | |
51 | y = R.randrange(LIMIT) | |
52 | print ' %s %s %s;' % (put(x), put(y), put(func(x, y) & MASK)) | |
53 | print '}' |