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':