-def rol(x, n): return ((x << n) | (x >> (WD - n))) & MASK
-def ror(x, n): return ((x >> n) | (x << (WD - n))) & MASK
-def put(x): return '%0*x' % (WD//4, x)
-
-for name, func in [('lsl', lambda x, n: x << n),
- ('lsr', lambda x, n: x >> n),
- ('rol', rol),
- ('ror', ror)]:
- print('\n%s64 {' % name)
- for i in xrange(NVEC):
- x = R.randrange(LIMIT)
- sh = R.randrange(0, 70) & 63
- print(' %s %2d %s;' % (put(x), sh, put(func(x, sh) & MASK)))
- for i in xrange(4):
- x = R.randrange(LIMIT)
- sh = 32
- print(' %s %2d %s;' % (put(x), sh, put(func(x, sh) & MASK)))
- print('}')
-
-for name, func in [('add', lambda x, y: x + y),
- ('sub', lambda x, y: x - y)]:
- print('\n%s64 {' % name)
- for i in xrange(NVEC):
- x = R.randrange(LIMIT)
- y = R.randrange(LIMIT)
- print(' %s %s %s;' % (put(x), put(y), put(func(x, y) & MASK)))
- print('}')
+class ArithVector (BaseVector):
+ _REGS = ["x", "y", "z"]
+ _RFMT = { "x": FMT, "y": FMT, "z": FMT }
+ def add(me, r):
+ for i in xrange(NVEC):
+ x = r.randrange(LIMIT)
+ y = r.randrange(LIMIT)
+ z = me._op(x, y)
+ me._append(x, y, z)
+class AddVector (ArithVector):
+ _NAME = "add64"
+ def _op(me, x, y): return (x + y)&MASK
+class SubVector (ArithVector):
+ _NAME = "sub64"
+ def _op(me, x, y): return (x - y)&MASK
+
+VECS = [LSLVector(), LSRVector(), ROLVector(), RORVector(),
+ AddVector(), SubVector()]
+
+for arg in SYS.argv[1:]:
+ if arg == "-": seed = R.SystemRandom().randrange(1 << 32)
+ else: seed = int(arg, 0)
+ r = R.Random(seed)
+ for v in VECS: v.newseed(seed); v.add(r)
+
+print(";;; -*-conf-*- Test vectors for 64-bit arithmetic macros")
+print(";;; [generated]")
+
+for v in VECS: v.write()