Mercurial > repos > blastem
comparison gentests.py @ 1283:188a60def81f
Fixed some deficiencies in the 68K test generator
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 17 Mar 2017 08:02:03 -0700 |
parents | 097c172839d4 |
children | f6ee0df6bb48 |
comparison
equal
deleted
inserted
replaced
1282:c5821f9de325 | 1283:188a60def81f |
---|---|
59 self.inst.write_init(outfile, already) | 59 self.inst.write_init(outfile, already) |
60 if 'label' in already: | 60 if 'label' in already: |
61 outfile.write('lbl_' + str(already['label']) + ':\n') | 61 outfile.write('lbl_' + str(already['label']) + ':\n') |
62 outfile.write('\t'+str(self.inst)+'\n') | 62 outfile.write('\t'+str(self.inst)+'\n') |
63 outfile.write('\t'+self.inst.save_result(self.get_dreg(), False) + '\n') | 63 outfile.write('\t'+self.inst.save_result(self.get_dreg(), False) + '\n') |
64 outfile.write('\treset\n') | 64 outfile.write('\treset\nforever:\n\tbra.s forever\n') |
65 | 65 |
66 def consume_dreg(self, num): | 66 def consume_dreg(self, num): |
67 self.avail_dregs.discard(num) | 67 self.avail_dregs.discard(num) |
68 | 68 |
69 def consume_areg(self, num): | 69 def consume_areg(self, num): |
107 | 107 |
108 def valid_ram_address(address, size='b'): | 108 def valid_ram_address(address, size='b'): |
109 return address >= 0xE00000 and address <= 0xFFFFFFFC and (address & 0xE00000) == 0xE00000 and (size == 'b' or not address & 1) | 109 return address >= 0xE00000 and address <= 0xFFFFFFFC and (address & 0xE00000) == 0xE00000 and (size == 'b' or not address & 1) |
110 | 110 |
111 def random_ram_address(mina=0xE00000, maxa=0xFFFFFFFC): | 111 def random_ram_address(mina=0xE00000, maxa=0xFFFFFFFC): |
112 return randint(mina, maxa) | 0xE00000 | 112 return randint(mina/2, maxa/2)*2 | 0xE00000 |
113 | 113 |
114 class Indexed(object): | 114 class Indexed(object): |
115 def __init__(self, base, index, index_size, disp): | 115 def __init__(self, base, index, index_size, disp): |
116 self.base = base | 116 self.base = base |
117 self.index = index | 117 self.index = index |
126 index = index & 0xFFFF | 126 index = index & 0xFFFF |
127 #sign extend index | 127 #sign extend index |
128 if index & 0x8000: | 128 if index & 0x8000: |
129 index -= 65536 | 129 index -= 65536 |
130 if index > -1024: | 130 if index > -1024: |
131 index = already[str(self.index)] = randint(-32768, -1024) | 131 index = already[str(self.index)] = 2 * randint(-16384, -512) |
132 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') | 132 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') |
133 else: | 133 else: |
134 index = already[str(self.index)] = randint(-32768, -1024) | 134 index = already[str(self.index)] = 2 * randint(-16384, -512) |
135 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') | 135 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') |
136 num = already.get('label', 0)+1 | 136 num = already.get('label', 0)+1 |
137 already['label'] = num | 137 already['label'] = num |
138 if (already[str(self.index)] + self.disp) & 1: | |
139 self.disp += 1 | |
138 address = 'lbl_' + str(num) + ' + 2 + ' + str(self.disp) + ' + ' + str(index) | 140 address = 'lbl_' + str(num) + ' + 2 + ' + str(self.disp) + ' + ' + str(index) |
139 else: | 141 else: |
140 if self.base == self.index: | 142 if self.base == self.index: |
141 if str(self.base) in already: | 143 if str(self.base) in already: |
142 if not valid_ram_address(already[str(self.base)]*2): | 144 if not valid_ram_address(already[str(self.base)]*2): |
204 self.index.consume_regs(program) | 206 self.index.consume_regs(program) |
205 | 207 |
206 class Displacement(object): | 208 class Displacement(object): |
207 def __init__(self, base, disp): | 209 def __init__(self, base, disp): |
208 self.base = base | 210 self.base = base |
209 self.disp = disp | 211 if disp & 1: |
212 disp += 1 | |
213 self.disp = disp | |
210 | 214 |
211 def write_init(self, outfile, size, already): | 215 def write_init(self, outfile, size, already): |
212 if self.base.kind == 'pc': | 216 if self.base.kind == 'pc': |
213 num = already.get('label', 0)+1 | 217 num = already.get('label', 0)+1 |
214 already['label'] = num | 218 already['label'] = num |
372 | 376 |
373 def all_pc_indexed(): | 377 def all_pc_indexed(): |
374 return [Indexed(Register('pc', 0), index, index_size, randint(-128, 127)) for index in all_dregs + all_aregs for index_size in ('w','l')] | 378 return [Indexed(Register('pc', 0), index, index_size, randint(-128, 127)) for index in all_dregs + all_aregs for index_size in ('w','l')] |
375 | 379 |
376 def rand_abs_short(): | 380 def rand_abs_short(): |
377 return [Absolute(0xFFFF8000 + randint(0, 32767), 'w') for x in xrange(0, 8)] | 381 return [Absolute(random_ram_address(0xFFFF8000), 'w') for x in xrange(0, 8)] |
378 | 382 |
379 def rand_abs_long(): | 383 def rand_abs_long(): |
380 return [Absolute(0xFF0000 + randint(0, 65535), 'l') for x in xrange(0, 8)] | 384 return [Absolute(random_ram_address(), 'l') for x in xrange(0, 8)] |
381 | 385 |
382 def get_size_range(size): | 386 def get_size_range(size): |
383 if size == 'b': | 387 if size == 'b': |
384 return (-128, 127) | 388 return (-128, 127) |
385 elif size == 'w': | 389 elif size == 'w': |