|
- import sys, os, random
- sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
- from helpertest import *
- from objfmt import Obj
- from pcasm import assemble
-
- orig = Obj.parse(open('lib/cmulti.obj','rb').read())
- new, _ = assemble(open('src/cmulti.s').read())
- ho = Helper(orig, 0x6000, {}); hn = Helper(new, 0x6000, {})
- rnd = random.Random(1)
- cases = [(a,b) for a in (0,1,2,3,7,255,256,257,1000,32767,65535) for b in (0,1,2,3,7,255,256,257,1000,32767,65535)]
- cases += [(rnd.randrange(65536), rnd.randrange(65536)) for _ in range(600)]
- cases += [(rnd.randrange(256), rnd.randrange(65536)) for _ in range(300)] + [(rnd.randrange(65536), rnd.randrange(256)) for _ in range(300)]
- co = cn = 0; bad = 0
- for a, b in cases:
- for accinit in ((0,0),):
- res = []
- for h in (ho, hn):
- cpu = CPU(); h.install(cpu)
- cpu.m[0x5a], cpu.m[0x5b] = a & 255, a >> 8
- cpu.m[0x5c], cpu.m[0x5d] = b & 255, b >> 8
- cpu.m[0x5e], cpu.m[0x5f] = accinit
- c = cpu.call(h.addr('C$MULTI'))
- res.append((c, bytes(cpu.m[0x40:0x70]), cpu))
- co += res[0][0]; cn += res[1][0]
- lo_o = res[0][2].m[0x5c] | res[0][2].m[0x5d] << 8
- lo_n = res[1][2].m[0x5c] | res[1][2].m[0x5d] << 8
- if lo_o != lo_n or lo_o != (a*b) & 0xFFFF or res[0][1][:0x1a] != res[1][1][:0x1a]:
- bad += 1
- if bad < 5: print('MISMATCH', a, b, lo_o, lo_n, res[0][1].hex(), res[1][1].hex())
- print('cases', len(cases), 'bad', bad, 'avg cycles orig %.0f new %.0f' % (co/len(cases), cn/len(cases)))
- print('code size orig', len(orig.code), 'new', len(new.code))
|