Mercurial > repos > blastem
changeset 2708:2fb2e989186f
Fix regression in CPU DSL var handling
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 07 Jul 2025 22:12:42 -0700 |
parents | a64c0e1ed6ac |
children | 55eff4d9101d |
files | cpu_dsl.py |
diffstat | 1 files changed, 45 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/cpu_dsl.py Sun Jul 06 20:43:37 2025 -0700 +++ b/cpu_dsl.py Mon Jul 07 22:12:42 2025 -0700 @@ -224,6 +224,7 @@ def generateBody(self, value, prog, otype): output = [] prog.meta = {} + prog.declaredLocals.clear() prog.pushScope(self) self.regValues = {} for var in self.locals: @@ -260,6 +261,8 @@ begin += '\n\tuint{sz}_t {name};'.format(sz=self.locals[var], name=var) for size in prog.temp: begin += '\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size) + for name in prog.declaredLocals: + begin += f'\n\tuint{prog.declaredLocals[name]}_t {name};' prog.popScope() if prog.dispatch == 'goto': output += prog.nextInstruction(otype) @@ -283,6 +286,7 @@ self.locals = {} self.regValues = {} self.argValues = {} + self.sizedLocals = {} def addOp(self, op): if op.op == 'arg': @@ -298,6 +302,8 @@ self.implementation.append(op) def resolveLocal(self, name): + if name in self.sizedLocals: + return self.sizedLocals[name] if name in self.locals: return self.name + '_' + name return None @@ -319,7 +325,6 @@ argValues = {} if parent: self.regValues = parent.regValues - output.append('\n\t{') prog.pushScope(self) i = 0 for name,size in self.args: @@ -327,11 +332,17 @@ i += 1 for name in self.locals: size = self.locals[name] - output.append('\n\tuint{size}_t {sub}_{local};'.format(size=size, sub=self.name, local=name)) + fullName = f'{self.name}_{name}' + declare = not fullName in prog.declaredLocals + if not declare and prog.declaredLocals[fullName] != size: + self.sizedLocals[name] = fullName + fullName = f'{self.name}_{size}_{name}' + declare = True + if declare: + prog.declaredLocals[fullName] = size self.argValues = argValues self.processOps(prog, argValues, output, otype, self.implementation) prog.popScope() - output.append('\n\t}') def __str__(self): pieces = [self.name] @@ -2082,6 +2093,7 @@ self.declares = [] self.lastSize = None self.mainDispatch = set() + self.declaredLocals = {} def __str__(self): pieces = [] @@ -2181,12 +2193,22 @@ if self.interrupt in self.subroutines: self.meta = {} self.temp = {} - self.subroutines[self.interrupt].inline(self, [], output, otype, None) + body = [] + self.declaredLocals.clear() + self.subroutines[self.interrupt].inline(self, [], body, otype, None) + for name in self.declaredLocals: + output.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') + output += body output.append('\n\t}') self.meta = {} self.temp = {} - self.subroutines[self.body].inline(self, [], output, otype, None) + self.declaredLocals.clear() + body = [] + self.subroutines[self.body].inline(self, [], body, otype, None) + for name in self.declaredLocals: + output.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') + output += body return output def build(self, otype): @@ -2229,9 +2251,12 @@ self.meta = {} self.temp = {} intpieces = [] + self.declaredLocals.clear() self.subroutines[self.interrupt].inline(self, [], intpieces, 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 if self.pc_offset: pieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};') @@ -2245,7 +2270,12 @@ pieces.append('\n\t\t\t}') self.meta = {} self.temp = {} - self.subroutines[self.body].inline(self, [], pieces, otype, None) + 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)') @@ -2257,13 +2287,21 @@ self.meta = {} self.temp = {} intpieces = [] + self.declaredLocals.clear() self.subroutines[self.interrupt].inline(self, [], intpieces, 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 self.meta = {} self.temp = {} - self.subroutines[self.body].inline(self, [], pieces, otype, None) + 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}') if self.pc_reg: pieces.append('\n\t}')