Mercurial > repos > blastem
comparison gentests.py @ 217:acd29e2664c6
Added testcases file. Some fixes to test generator for dealing with indexed mode with base and index reg the same. Added support for blastem headless mode in test runner.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 20 Apr 2013 00:29:14 -0700 |
parents | 9126c33cc33c |
children | cb72780e17b1 |
comparison
equal
deleted
inserted
replaced
216:0b5ec22dcda2 | 217:acd29e2664c6 |
---|---|
104 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') | 104 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') |
105 num = already.get('label', 0)+1 | 105 num = already.get('label', 0)+1 |
106 already['label'] = num | 106 already['label'] = num |
107 address = 'lbl_' + str(num) + ' + 2 + ' + str(self.disp) + ' + ' + str(index) | 107 address = 'lbl_' + str(num) + ' + 2 + ' + str(self.disp) + ' + ' + str(index) |
108 else: | 108 else: |
109 if str(self.base) in already: | 109 if self.base == self.index: |
110 if not valid_ram_address(already[str(self.base)]): | 110 if str(self.base) in already: |
111 del already[str(self.base)] | 111 if not valid_ram_address(already[str(self.base)]*2): |
112 self.write_init(outfile, size, already) | 112 del already[str(self.base)] |
113 return | 113 self.write_init(outfile, size, already) |
114 else: | 114 return |
115 base = already[str(self.base)] | 115 else: |
116 else: | 116 base = index = already[str(self.base)] |
117 base = already[str(self.base)] = random_ram_address() | 117 else: |
118 outfile.write('\tmove.l #' + str(base) + ', ' + str(self.base) + '\n') | 118 base = index = already[str(self.base)] = random_ram_address()/2 |
119 if str(self.index) in already: | 119 outfile.write('\tmove.l #' + str(base) + ', ' + str(self.base) + '\n') |
120 index = already[str(self.index)] | 120 else: |
121 if self.index_size == 'w': | 121 if str(self.base) in already: |
122 index = index & 0xFFFF | 122 if not valid_ram_address(already[str(self.base)]): |
123 #sign extend index | 123 del already[str(self.base)] |
124 if index & 0x8000: | 124 self.write_init(outfile, size, already) |
125 index -= 65536 | 125 return |
126 if not valid_ram_address(base + index): | 126 else: |
127 base = already[str(self.base)] | |
128 else: | |
129 base = already[str(self.base)] = random_ram_address() | |
130 outfile.write('\tmove.l #' + str(base) + ', ' + str(self.base) + '\n') | |
131 if str(self.index) in already: | |
132 index = already[str(self.index)] | |
133 if self.index_size == 'w': | |
134 index = index & 0xFFFF | |
135 #sign extend index | |
136 if index & 0x8000: | |
137 index -= 65536 | |
138 if not valid_ram_address(base + index): | |
139 index = already[str(self.index)] = randint(-64, 63) | |
140 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') | |
141 else: | |
127 index = already[str(self.index)] = randint(-64, 63) | 142 index = already[str(self.index)] = randint(-64, 63) |
128 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') | 143 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') |
129 else: | |
130 index = already[str(self.index)] = randint(-64, 63) | |
131 outfile.write('\tmove.l #' + str(index) + ', ' + str(self.index) + '\n') | |
132 address = base + index + self.disp | 144 address = base + index + self.disp |
133 if (address & 0xFFFFFF) < 0xE00000: | 145 if (address & 0xFFFFFF) < 0xE00000: |
134 if (address & 0xFFFFFF) < 128: | 146 if (address & 0xFFFFFF) < 128: |
135 self.disp -= (address & 0xFFFFFF) | 147 self.disp -= (address & 0xFFFFFF) |
136 else: | 148 else: |
364 return rand_immediate(size) | 376 return rand_immediate(size) |
365 elif mode.startswith('#(') and mode.endswith(')'): | 377 elif mode.startswith('#(') and mode.endswith(')'): |
366 inner = mode[2:-1] | 378 inner = mode[2:-1] |
367 start,sep,end = inner.partition('-') | 379 start,sep,end = inner.partition('-') |
368 return [Immediate(num) for num in range(int(start), int(end))] | 380 return [Immediate(num) for num in range(int(start), int(end))] |
381 else: | |
382 print "Don't know what to do with source type", mode | |
383 return None | |
369 | 384 |
370 class Inst2Op(object): | 385 class Inst2Op(object): |
371 def __init__(self, name, size, src, dst): | 386 def __init__(self, name, size, src, dst): |
372 self.name = name | 387 self.name = name |
373 self.size = size | 388 self.size = size |
385 if type(self.dst) == Register: | 400 if type(self.dst) == Register: |
386 del already[str(self.dst)] | 401 del already[str(self.dst)] |
387 | 402 |
388 def save_result(self, reg, always): | 403 def save_result(self, reg, always): |
389 if always or type(self.dst) != Register: | 404 if always or type(self.dst) != Register: |
390 return 'move.' + self.size + ' ' + str(self.dst) + ', ' + str(reg) | 405 if type(self.dst) == Decrement: |
406 src = Increment(self.dst.reg) | |
407 elif type(self.dst) == Increment: | |
408 src = Decrement(self.dst.reg) | |
409 else: | |
410 src = self.dst | |
411 return 'move.' + self.size + ' ' + str(src) + ', ' + str(reg) | |
391 else: | 412 else: |
392 return '' | 413 return '' |
393 | 414 |
394 def consume_regs(self, program): | 415 def consume_regs(self, program): |
395 self.src.consume_regs(program) | 416 self.src.consume_regs(program) |