Mercurial > repos > blastem
changeset 2712:d653a8c383d3
some CPU DSL fixes
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 10 Jul 2025 16:06:33 -0700 |
parents | 7e5aaa84fa78 |
children | a88eff3fb5d8 |
files | cpu_dsl.py |
diffstat | 1 files changed, 29 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/cpu_dsl.py Thu Jul 10 16:06:13 2025 -0700 +++ b/cpu_dsl.py Thu Jul 10 16:06:33 2025 -0700 @@ -40,8 +40,10 @@ if len(parts) == 4 and parts[2] in compareOps: self.addOp(NormalOp(['cmp', parts[3], parts[1]])) cond = parts[2] + elif len(parts) == 2: + cond = parts[1] else: - cond = parts[1] + raise Exception('Invalid if: ' + ' '.join(parts)) o = If(self, cond) self.addOp(o) return o @@ -2238,66 +2240,51 @@ if self.body in self.subroutines: pieces.append('\nvoid {pre}execute({type} *context, uint32_t target_cycle)'.format(pre = self.prefix, type = self.context_type)) pieces.append('\n{') + bodyPieces = [] + self.declaredLocals.clear() if self.sync_cycle: - pieces.append('\n\t{sync}(context, target_cycle);'.format(sync=self.sync_cycle)) + bodyPieces.append('\n\t{sync}(context, target_cycle);'.format(sync=self.sync_cycle)) if self.pc_reg: - pieces.append('\n\tif (context->breakpoints) {') - pieces.append('\n\t\twhile (context->cycles < target_cycle)') - pieces.append('\n\t\t{') + bodyPieces.append('\n\tif (context->breakpoints) {') + bodyPieces.append('\n\t\twhile (context->cycles < target_cycle)') + bodyPieces.append('\n\t\t{') if self.interrupt in self.subroutines: - pieces.append('\n\t\t\tif (context->cycles >= context->sync_cycle) {') - pieces.append(f'\n\t\t\t\t{self.sync_cycle}(context, target_cycle);') - pieces.append('\n\t\t\t}') + bodyPieces.append('\n\t\t\tif (context->cycles >= context->sync_cycle) {') + bodyPieces.append(f'\n\t\t\t\t{self.sync_cycle}(context, target_cycle);') + bodyPieces.append('\n\t\t\t}') self.meta = {} self.temp = {} - intpieces = [] - self.declaredLocals.clear() - self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None) + self.subroutines[self.interrupt].inline(self, [], bodyPieces, otype, None) for size in self.temp: - pieces.append('\n\t\t\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) - for name in self.declaredLocals: - pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') - pieces += intpieces + bodyPieces.append('\n\t\t\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) if self.pc_offset: - pieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};') + bodyPieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};') pc_reg = 'debug_pc' else: pc_reg = 'context->' + self.pc_reg - pieces.append('\n\t\t\tchar key_buf[6];') - pieces.append(f'\n\t\t\tdebug_handler handler = tern_find_ptr(context->breakpoints, tern_int_key({pc_reg}, key_buf));') - pieces.append('\n\t\t\tif (handler) {') - pieces.append(f'\n\t\t\t\thandler(context, {pc_reg});') - pieces.append('\n\t\t\t}') + bodyPieces.append('\n\t\t\tchar key_buf[6];') + bodyPieces.append(f'\n\t\t\tdebug_handler handler = tern_find_ptr(context->breakpoints, tern_int_key({pc_reg}, key_buf));') + bodyPieces.append('\n\t\t\tif (handler) {') + bodyPieces.append(f'\n\t\t\t\thandler(context, {pc_reg});') + bodyPieces.append('\n\t\t\t}') self.meta = {} self.temp = {} - self.declaredLocals.clear() - bodyPieces = [] self.subroutines[self.body].inline(self, [], bodyPieces, otype, None) - for name in self.declaredLocals: - pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') - pieces += bodyPieces - pieces.append('\n\t}') - pieces.append('\n\t} else {') - pieces.append('\n\twhile (context->cycles < target_cycle)') - pieces.append('\n\t{') + bodyPieces.append('\n\t}') + bodyPieces.append('\n\t} else {') + bodyPieces.append('\n\twhile (context->cycles < target_cycle)') + bodyPieces.append('\n\t{') if self.interrupt in self.subroutines: - pieces.append('\n\t\tif (context->cycles >= context->sync_cycle) {') - pieces.append(f'\n\t\t\t{self.sync_cycle}(context, target_cycle);') - pieces.append('\n\t\t}') + bodyPieces.append('\n\t\tif (context->cycles >= context->sync_cycle) {') + bodyPieces.append(f'\n\t\t\t{self.sync_cycle}(context, target_cycle);') + bodyPieces.append('\n\t\t}') self.meta = {} self.temp = {} - intpieces = [] - self.declaredLocals.clear() - self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None) + self.subroutines[self.interrupt].inline(self, [], bodyPieces, otype, None) for size in self.temp: - pieces.append('\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) - for name in self.declaredLocals: - pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') - pieces += intpieces + bodyPieces.append('\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) self.meta = {} self.temp = {} - self.declaredLocals.clear() - bodyPieces = [] self.subroutines[self.body].inline(self, [], bodyPieces, otype, None) for name in self.declaredLocals: pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};')