4 ### Generate input script and expected output for bit manipulation,
5 ### particularly 64-bit arithmetic.
10 if SYS.version_info >= (3,): xrange = range
17 ARGS = SYS.argv[1:]; ARGS.reverse()
18 def arg(default = None):
19 if len(ARGS): return ARGS.pop()
24 if seed is None: SEED = R.randrange(0, 1 << 32)
25 else: SEED = int(seed, 0)
28 print('### Test vectors for 64-bit arithmetic macros')
29 print('### [generated; seed = 0x%08x]' % SEED)
31 def rol(x, n): return ((x << n) | (x >> (WD - n))) & MASK
32 def ror(x, n): return ((x >> n) | (x << (WD - n))) & MASK
33 def put(x): return '%0*x' % (WD//4, x)
35 for name, func in [('lsl', lambda x, n: x << n),
36 ('lsr', lambda x, n: x >> n),
39 print('\n%s64 {' % name)
40 for i in xrange(NVEC):
41 x = R.randrange(LIMIT)
42 sh = R.randrange(0, 70) & 63
43 print(' %s %2d %s;' % (put(x), sh, put(func(x, sh) & MASK)))
45 x = R.randrange(LIMIT)
47 print(' %s %2d %s;' % (put(x), sh, put(func(x, sh) & MASK)))
50 for name, func in [('add', lambda x, y: x + y),
51 ('sub', lambda x, y: x - y)]:
52 print('\n%s64 {' % name)
53 for i in xrange(NVEC):
54 x = R.randrange(LIMIT)
55 y = R.randrange(LIMIT)
56 print(' %s %s %s;' % (put(x), put(y), put(func(x, y) & MASK)))