Mercurial > repos > blastem
comparison cpu_dsl.py @ 2618:1579b840a1af
Implement stop in new 68K core
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 21 Feb 2025 01:45:04 -0800 |
parents | cbd54de385d3 |
children | ce9386a7b21e |
comparison
equal
deleted
inserted
replaced
2617:ad9e074c8901 | 2618:1579b840a1af |
---|---|
41 self.addOp(NormalOp(['cmp', parts[3], parts[1]])) | 41 self.addOp(NormalOp(['cmp', parts[3], parts[1]])) |
42 cond = parts[2] | 42 cond = parts[2] |
43 else: | 43 else: |
44 cond = parts[1] | 44 cond = parts[1] |
45 o = If(self, cond) | 45 o = If(self, cond) |
46 self.addOp(o) | |
47 return o | |
48 elif parts[0] == 'loop': | |
49 o = Loop(self, None if len(parts) == 1 else parts[1]) | |
46 self.addOp(o) | 50 self.addOp(o) |
47 return o | 51 return o |
48 elif parts[0] == 'end': | 52 elif parts[0] == 'end': |
49 raise Exception('end is only allowed inside a switch or if block') | 53 raise Exception('end is only allowed inside a switch or if block') |
50 else: | 54 else: |
1282 dst = params[2], sz = params[0], val = params[1] | 1286 dst = params[2], sz = params[0], val = params[1] |
1283 )), | 1287 )), |
1284 'xchg': Op().addImplementation('c', (0,1), _xchgCImpl), | 1288 'xchg': Op().addImplementation('c', (0,1), _xchgCImpl), |
1285 'dispatch': Op().addImplementation('c', None, _dispatchCImpl), | 1289 'dispatch': Op().addImplementation('c', None, _dispatchCImpl), |
1286 'update_flags': Op().addImplementation('c', None, _updateFlagsCImpl), | 1290 'update_flags': Op().addImplementation('c', None, _updateFlagsCImpl), |
1287 'update_sync': Op().addImplementation('c', None, _updateSyncCImpl) | 1291 'update_sync': Op().addImplementation('c', None, _updateSyncCImpl), |
1292 'break': Op().addImplementation('c', None, lambda prog, params: '\n\tbreak;') | |
1288 } | 1293 } |
1289 | 1294 |
1290 #represents a simple DSL instruction | 1295 #represents a simple DSL instruction |
1291 class NormalOp: | 1296 class NormalOp: |
1292 def __init__(self, parts): | 1297 def __init__(self, parts): |
1681 for op in self.elseBody: | 1686 for op in self.elseBody: |
1682 op.processDispatch(prog) | 1687 op.processDispatch(prog) |
1683 | 1688 |
1684 def __str__(self): | 1689 def __str__(self): |
1685 lines = ['\n\tif'] | 1690 lines = ['\n\tif'] |
1691 for op in self.body: | |
1692 lines.append(str(op)) | |
1693 lines.append('\n\tend') | |
1694 return ''.join(lines) | |
1695 | |
1696 class Loop(ChildBlock): | |
1697 def __init__(self, parent, count): | |
1698 self.op = 'loop' | |
1699 self.parent = parent | |
1700 self.count = count | |
1701 self.body = [] | |
1702 self.locals = {} | |
1703 self.regValues = None | |
1704 | |
1705 def addOp(self, op): | |
1706 if op.op in ('case', 'arg', 'else'): | |
1707 raise Exception(op + ' is not allows inside an loop block') | |
1708 if op.op == 'local': | |
1709 name = op.params[0] | |
1710 size = op.params[1] | |
1711 self.locals[name] = size | |
1712 else: | |
1713 self.body.append(op) | |
1714 | |
1715 def localSize(self, name): | |
1716 return self.locals.get(name) | |
1717 | |
1718 def resolveLocal(self, name): | |
1719 if name in self.locals: | |
1720 return name | |
1721 return self.parent.resolveLocal(name) | |
1722 | |
1723 def processDispatch(self, prog): | |
1724 for op in self.body: | |
1725 op.processDispatch(prog) | |
1726 | |
1727 def generate(self, prog, parent, fieldVals, output, otype, flagUpdates): | |
1728 self.regValues = parent.regValues | |
1729 if self.count: | |
1730 count = prog.resolveParam(self.count, self, fieldVals) | |
1731 output.append('\n\tfor (uint32_t loop_counter__ = 0; loop_counter__ < {count}; loop_counter__++) {') | |
1732 else: | |
1733 output.append('\n\tfor (;;) {') | |
1734 self.processOps(prog, fieldVals, output, otype, self.body) | |
1735 output.append('\n\t}') | |
1736 | |
1737 def __str__(self): | |
1738 lines = ['\n\tloop'] | |
1739 if self.count: | |
1740 lines[0] += f' {self.count}' | |
1686 for op in self.body: | 1741 for op in self.body: |
1687 lines.append(str(op)) | 1742 lines.append(str(op)) |
1688 lines.append('\n\tend') | 1743 lines.append('\n\tend') |
1689 return ''.join(lines) | 1744 return ''.join(lines) |
1690 | 1745 |