comparison gentests.py @ 2582:6c475ddefd6f

Add support for ccr/sr update instructions to 68K test generator
author Michael Pavone <pavone@retrodev.com>
date Sat, 08 Feb 2025 13:34:07 -0800
parents db32408394c3
children 01cd8aa40573
comparison
equal deleted inserted replaced
2581:9e10149c9e10 2582:6c475ddefd6f
91 if self.kind == 'd' or self.kind == 'a': 91 if self.kind == 'd' or self.kind == 'a':
92 return self.kind + str(self.num) 92 return self.kind + str(self.num)
93 return self.kind 93 return self.kind
94 94
95 def write_init(self, outfile, size, already): 95 def write_init(self, outfile, size, already):
96 if not str(self) in already: 96 if not str(self) in already and not self.kind in ('ccr', 'sr'):
97 minv,maxv = get_size_range(size) 97 minv,maxv = get_size_range(size)
98 val = randint(minv,maxv) 98 val = randint(minv,maxv)
99 already[str(self)] = val 99 already[str(self)] = val
100 outfile.write('\tmove.'+size+' #'+str(val)+', ' + str(self) + '\n') 100 outfile.write('\tmove.'+size+' #'+str(val)+', ' + str(self) + '\n')
101 101
426 start,end = int(start),int(end) 426 start,end = int(start),int(end)
427 if end-start > 16: 427 if end-start > 16:
428 return [Immediate(randint(start, end)) for x in range(0,8)] 428 return [Immediate(randint(start, end)) for x in range(0,8)]
429 else: 429 else:
430 return [Immediate(num) for num in range(start, end+1)] 430 return [Immediate(num) for num in range(start, end+1)]
431 elif mode in ('ccr', 'sr'):
432 return [Register(mode, 0)]
431 else: 433 else:
432 print("Don't know what to do with source type", mode) 434 print("Don't know what to do with source type", mode)
433 return None 435 return None
434 436
435 class Inst2Op(object): 437 class Inst2Op(object):
445 def write_init(self, outfile, already): 447 def write_init(self, outfile, already):
446 self.src.write_init(outfile, self.size, already) 448 self.src.write_init(outfile, self.size, already)
447 self.dst.write_init(outfile, self.size, already) 449 self.dst.write_init(outfile, self.size, already)
448 450
449 def invalidate_dest(self, already): 451 def invalidate_dest(self, already):
450 if type(self.dst) == Register: 452 if type(self.dst) == Register and not self.dst.kind in ('ccr', 'sr'):
451 del already[str(self.dst)] 453 del already[str(self.dst)]
452 454
453 def save_result(self, reg, always): 455 def save_result(self, reg, always):
454 if always or type(self.dst) != Register: 456 if always or type(self.dst) != Register:
455 if type(self.dst) == Decrement: 457 if type(self.dst) == Decrement:
456 src = Increment(self.dst.reg) 458 src = Increment(self.dst.reg)
457 elif type(self.dst) == Increment: 459 elif type(self.dst) == Increment:
458 src = Decrement(self.dst.reg) 460 src = Decrement(self.dst.reg)
459 else: 461 else:
460 src = self.dst 462 src = self.dst
461 return 'move.' + self.size + ' ' + str(src) + ', ' + str(reg) 463 if type(src) is Register and src.kind == 'ccr':
464 return 'move sr, ' + str(reg)
465 else:
466 return 'move.' + self.size + ' ' + str(src) + ', ' + str(reg)
462 else: 467 else:
463 return '' 468 return ''
464 469
465 def consume_regs(self, program): 470 def consume_regs(self, program):
466 self.src.consume_regs(program) 471 self.src.consume_regs(program)