comparison gentests.py @ 439:bfbb8613efb4

Add support for single operand instructions to 68K test generator
author Mike Pavone <pavone@retrodev.com>
date Tue, 16 Jul 2013 23:16:38 -0700
parents 8db584faac4b
children 097c172839d4
comparison
equal deleted inserted replaced
438:b3cee2fe690b 439:bfbb8613efb4
69 def consume_areg(self, num): 69 def consume_areg(self, num):
70 self.avail_aregs.discard(num) 70 self.avail_aregs.discard(num)
71 71
72 def get_dreg(self): 72 def get_dreg(self):
73 return Register('d', self.avail_dregs.pop()) 73 return Register('d', self.avail_dregs.pop())
74
75 class Dummy(object):
76 def __str__(self):
77 return ''
78 def write_init(self, outfile, size, already):
79 pass
80 def consume_regs(self, program):
81 pass
82
83 dummy_op = Dummy()
74 84
75 class Register(object): 85 class Register(object):
76 def __init__(self, kind, num): 86 def __init__(self, kind, num):
77 self.kind = kind 87 self.kind = kind
78 self.num = num 88 self.num = num
439 449
440 def consume_regs(self, program): 450 def consume_regs(self, program):
441 self.src.consume_regs(program) 451 self.src.consume_regs(program)
442 self.dst.consume_regs(program) 452 self.dst.consume_regs(program)
443 453
454 class Inst1Op(Inst2Op):
455 def __init__(self, name, size, dst):
456 super(Inst1Op, self).__init__(name, size, dummy_op, dst)
457
458 def __str__(self):
459 return self.name + '.' + self.size + ' ' + str(self.dst)
460
444 class Entry(object): 461 class Entry(object):
445 def __init__(self, line): 462 def __init__(self, line):
446 fields = split_fields(line) 463 fields = split_fields(line)
447 self.name = fields[0] 464 self.name = fields[0]
448 sizes = fields[1] 465 sizes = fields[1]
449 sources = fields[2].split(';') 466 sources = fields[2].split(';')
450 dests = fields[3].split(';') 467 if len(fields) > 3:
468 dests = fields[3].split(';')
469 else:
470 dests = None
451 combos = [] 471 combos = []
452 for size in sizes: 472 for size in sizes:
453 for source in sources: 473 for source in sources:
454 if size != 'b' or source != 'a': 474 if size != 'b' or source != 'a':
455 for dest in dests: 475 if dests:
456 if size != 'b' or dest != 'a': 476 for dest in dests:
457 combos.append((size, source, dest)) 477 if size != 'b' or dest != 'a':
478 combos.append((size, source, dest))
479 else:
480 combos.append((size, None, source))
458 self.cases = combos 481 self.cases = combos
459 482
460 def programs(self): 483 def programs(self):
461 res = [] 484 res = []
462 for (size, src, dst) in self.cases: 485 for (size, src, dst) in self.cases:
463 sources = get_variations(src, size)
464 dests = get_variations(dst, size) 486 dests = get_variations(dst, size)
465 for source in sources: 487 if src:
488 sources = get_variations(src, size)
489 for source in sources:
490 for dest in dests:
491 res.append(Program(Inst2Op(self.name, size, source, dest)))
492 else:
466 for dest in dests: 493 for dest in dests:
467 res.append(Program(Inst2Op(self.name, size, source, dest))) 494 res.append(Program(Inst1Op(self.name, size, dest)))
468 return res 495 return res
469 496
470 def process_entries(f): 497 def process_entries(f):
471 entries = [] 498 entries = []
472 for line in f: 499 for line in f: