4 ### Generate input script and expected output for bit manipulation,
5 ### particularly 64-bit arithmetic.
15 ARGS
= SYS
.argv
[1:]; ARGS
.reverse()
16 def arg(default
= None):
17 if len(ARGS
): return ARGS
.pop()
21 SEED
= int(arg(R
.randrange(0, 1 << 32)))
24 print '### Test vectors for 64-bit arithmetic macros'
25 print '### [generated; seed = 0x%08x]' % SEED
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
)
31 for name
, func
in [('lsl', lambda x
, n
: x
<< n
),
32 ('lsr', lambda x
, n
: x
>> n
),
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
))
41 x
= R
.randrange(LIMIT
)
43 print ' %s %2d %s;' %
(put(x
), sh
, put(func(x
, sh
) & MASK
))
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
))