Mercurial > repos > blastem
comparison cpu_dsl.py @ 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 | c5dce4284e69 |
children |
comparison
equal
deleted
inserted
replaced
2707:a64c0e1ed6ac | 2708:2fb2e989186f |
---|---|
222 return funName | 222 return funName |
223 | 223 |
224 def generateBody(self, value, prog, otype): | 224 def generateBody(self, value, prog, otype): |
225 output = [] | 225 output = [] |
226 prog.meta = {} | 226 prog.meta = {} |
227 prog.declaredLocals.clear() | |
227 prog.pushScope(self) | 228 prog.pushScope(self) |
228 self.regValues = {} | 229 self.regValues = {} |
229 for var in self.locals: | 230 for var in self.locals: |
230 output.append('\n\tuint{sz}_t {name};'.format(sz=self.locals[var], name=var)) | 231 output.append('\n\tuint{sz}_t {name};'.format(sz=self.locals[var], name=var)) |
231 self.newLocals = [] | 232 self.newLocals = [] |
258 output.append(prog.flags.disperseFlags(prog, otype)) | 259 output.append(prog.flags.disperseFlags(prog, otype)) |
259 for var in self.newLocals: | 260 for var in self.newLocals: |
260 begin += '\n\tuint{sz}_t {name};'.format(sz=self.locals[var], name=var) | 261 begin += '\n\tuint{sz}_t {name};'.format(sz=self.locals[var], name=var) |
261 for size in prog.temp: | 262 for size in prog.temp: |
262 begin += '\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size) | 263 begin += '\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size) |
264 for name in prog.declaredLocals: | |
265 begin += f'\n\tuint{prog.declaredLocals[name]}_t {name};' | |
263 prog.popScope() | 266 prog.popScope() |
264 if prog.dispatch == 'goto': | 267 if prog.dispatch == 'goto': |
265 output += prog.nextInstruction(otype) | 268 output += prog.nextInstruction(otype) |
266 return begin + ''.join(output) + '\n}' | 269 return begin + ''.join(output) + '\n}' |
267 | 270 |
281 self.args = [] | 284 self.args = [] |
282 self.arg_map = {} | 285 self.arg_map = {} |
283 self.locals = {} | 286 self.locals = {} |
284 self.regValues = {} | 287 self.regValues = {} |
285 self.argValues = {} | 288 self.argValues = {} |
289 self.sizedLocals = {} | |
286 | 290 |
287 def addOp(self, op): | 291 def addOp(self, op): |
288 if op.op == 'arg': | 292 if op.op == 'arg': |
289 name = op.params[0] | 293 name = op.params[0] |
290 size = int(op.params[1]) | 294 size = int(op.params[1]) |
296 self.locals[name] = size | 300 self.locals[name] = size |
297 else: | 301 else: |
298 self.implementation.append(op) | 302 self.implementation.append(op) |
299 | 303 |
300 def resolveLocal(self, name): | 304 def resolveLocal(self, name): |
305 if name in self.sizedLocals: | |
306 return self.sizedLocals[name] | |
301 if name in self.locals: | 307 if name in self.locals: |
302 return self.name + '_' + name | 308 return self.name + '_' + name |
303 return None | 309 return None |
304 | 310 |
305 def addLocal(self, name, size): | 311 def addLocal(self, name, size): |
317 if len(params) != len(self.args): | 323 if len(params) != len(self.args): |
318 raise Exception('{0} expects {1} arguments, but was called with {2}'.format(self.name, len(self.args), len(params))) | 324 raise Exception('{0} expects {1} arguments, but was called with {2}'.format(self.name, len(self.args), len(params))) |
319 argValues = {} | 325 argValues = {} |
320 if parent: | 326 if parent: |
321 self.regValues = parent.regValues | 327 self.regValues = parent.regValues |
322 output.append('\n\t{') | |
323 prog.pushScope(self) | 328 prog.pushScope(self) |
324 i = 0 | 329 i = 0 |
325 for name,size in self.args: | 330 for name,size in self.args: |
326 argValues[name] = params[i] | 331 argValues[name] = params[i] |
327 i += 1 | 332 i += 1 |
328 for name in self.locals: | 333 for name in self.locals: |
329 size = self.locals[name] | 334 size = self.locals[name] |
330 output.append('\n\tuint{size}_t {sub}_{local};'.format(size=size, sub=self.name, local=name)) | 335 fullName = f'{self.name}_{name}' |
336 declare = not fullName in prog.declaredLocals | |
337 if not declare and prog.declaredLocals[fullName] != size: | |
338 self.sizedLocals[name] = fullName | |
339 fullName = f'{self.name}_{size}_{name}' | |
340 declare = True | |
341 if declare: | |
342 prog.declaredLocals[fullName] = size | |
331 self.argValues = argValues | 343 self.argValues = argValues |
332 self.processOps(prog, argValues, output, otype, self.implementation) | 344 self.processOps(prog, argValues, output, otype, self.implementation) |
333 prog.popScope() | 345 prog.popScope() |
334 output.append('\n\t}') | |
335 | 346 |
336 def __str__(self): | 347 def __str__(self): |
337 pieces = [self.name] | 348 pieces = [self.name] |
338 for name,size in self.args: | 349 for name,size in self.args: |
339 pieces.append('\n\targ {0} {1}'.format(name, size)) | 350 pieces.append('\n\targ {0} {1}'.format(name, size)) |
2080 self.sizeAdjust = None | 2091 self.sizeAdjust = None |
2081 self.conditional = False | 2092 self.conditional = False |
2082 self.declares = [] | 2093 self.declares = [] |
2083 self.lastSize = None | 2094 self.lastSize = None |
2084 self.mainDispatch = set() | 2095 self.mainDispatch = set() |
2096 self.declaredLocals = {} | |
2085 | 2097 |
2086 def __str__(self): | 2098 def __str__(self): |
2087 pieces = [] | 2099 pieces = [] |
2088 for reg in self.regs: | 2100 for reg in self.regs: |
2089 pieces.append(str(self.regs[reg])) | 2101 pieces.append(str(self.regs[reg])) |
2179 output.append('\n\tif (context->cycles >= context->sync_cycle) {') | 2191 output.append('\n\tif (context->cycles >= context->sync_cycle) {') |
2180 output.append('\n\tif (context->cycles >= target_cycle) { return; }') | 2192 output.append('\n\tif (context->cycles >= target_cycle) { return; }') |
2181 if self.interrupt in self.subroutines: | 2193 if self.interrupt in self.subroutines: |
2182 self.meta = {} | 2194 self.meta = {} |
2183 self.temp = {} | 2195 self.temp = {} |
2184 self.subroutines[self.interrupt].inline(self, [], output, otype, None) | 2196 body = [] |
2197 self.declaredLocals.clear() | |
2198 self.subroutines[self.interrupt].inline(self, [], body, otype, None) | |
2199 for name in self.declaredLocals: | |
2200 output.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') | |
2201 output += body | |
2185 output.append('\n\t}') | 2202 output.append('\n\t}') |
2186 | 2203 |
2187 self.meta = {} | 2204 self.meta = {} |
2188 self.temp = {} | 2205 self.temp = {} |
2189 self.subroutines[self.body].inline(self, [], output, otype, None) | 2206 self.declaredLocals.clear() |
2207 body = [] | |
2208 self.subroutines[self.body].inline(self, [], body, otype, None) | |
2209 for name in self.declaredLocals: | |
2210 output.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') | |
2211 output += body | |
2190 return output | 2212 return output |
2191 | 2213 |
2192 def build(self, otype): | 2214 def build(self, otype): |
2193 body = [] | 2215 body = [] |
2194 pieces = [] | 2216 pieces = [] |
2227 pieces.append(f'\n\t\t\t\t{self.sync_cycle}(context, target_cycle);') | 2249 pieces.append(f'\n\t\t\t\t{self.sync_cycle}(context, target_cycle);') |
2228 pieces.append('\n\t\t\t}') | 2250 pieces.append('\n\t\t\t}') |
2229 self.meta = {} | 2251 self.meta = {} |
2230 self.temp = {} | 2252 self.temp = {} |
2231 intpieces = [] | 2253 intpieces = [] |
2254 self.declaredLocals.clear() | |
2232 self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None) | 2255 self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None) |
2233 for size in self.temp: | 2256 for size in self.temp: |
2234 pieces.append('\n\t\t\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) | 2257 pieces.append('\n\t\t\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) |
2258 for name in self.declaredLocals: | |
2259 pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') | |
2235 pieces += intpieces | 2260 pieces += intpieces |
2236 if self.pc_offset: | 2261 if self.pc_offset: |
2237 pieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};') | 2262 pieces.append(f'\n\t\t\tuint32_t debug_pc = context->{self.pc_reg} - {self.pc_offset};') |
2238 pc_reg = 'debug_pc' | 2263 pc_reg = 'debug_pc' |
2239 else: | 2264 else: |
2243 pieces.append('\n\t\t\tif (handler) {') | 2268 pieces.append('\n\t\t\tif (handler) {') |
2244 pieces.append(f'\n\t\t\t\thandler(context, {pc_reg});') | 2269 pieces.append(f'\n\t\t\t\thandler(context, {pc_reg});') |
2245 pieces.append('\n\t\t\t}') | 2270 pieces.append('\n\t\t\t}') |
2246 self.meta = {} | 2271 self.meta = {} |
2247 self.temp = {} | 2272 self.temp = {} |
2248 self.subroutines[self.body].inline(self, [], pieces, otype, None) | 2273 self.declaredLocals.clear() |
2274 bodyPieces = [] | |
2275 self.subroutines[self.body].inline(self, [], bodyPieces, otype, None) | |
2276 for name in self.declaredLocals: | |
2277 pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') | |
2278 pieces += bodyPieces | |
2249 pieces.append('\n\t}') | 2279 pieces.append('\n\t}') |
2250 pieces.append('\n\t} else {') | 2280 pieces.append('\n\t} else {') |
2251 pieces.append('\n\twhile (context->cycles < target_cycle)') | 2281 pieces.append('\n\twhile (context->cycles < target_cycle)') |
2252 pieces.append('\n\t{') | 2282 pieces.append('\n\t{') |
2253 if self.interrupt in self.subroutines: | 2283 if self.interrupt in self.subroutines: |
2255 pieces.append(f'\n\t\t\t{self.sync_cycle}(context, target_cycle);') | 2285 pieces.append(f'\n\t\t\t{self.sync_cycle}(context, target_cycle);') |
2256 pieces.append('\n\t\t}') | 2286 pieces.append('\n\t\t}') |
2257 self.meta = {} | 2287 self.meta = {} |
2258 self.temp = {} | 2288 self.temp = {} |
2259 intpieces = [] | 2289 intpieces = [] |
2290 self.declaredLocals.clear() | |
2260 self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None) | 2291 self.subroutines[self.interrupt].inline(self, [], intpieces, otype, None) |
2261 for size in self.temp: | 2292 for size in self.temp: |
2262 pieces.append('\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) | 2293 pieces.append('\n\tuint{sz}_t gen_tmp{sz}__;'.format(sz=size)) |
2294 for name in self.declaredLocals: | |
2295 pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') | |
2263 pieces += intpieces | 2296 pieces += intpieces |
2264 self.meta = {} | 2297 self.meta = {} |
2265 self.temp = {} | 2298 self.temp = {} |
2266 self.subroutines[self.body].inline(self, [], pieces, otype, None) | 2299 self.declaredLocals.clear() |
2300 bodyPieces = [] | |
2301 self.subroutines[self.body].inline(self, [], bodyPieces, otype, None) | |
2302 for name in self.declaredLocals: | |
2303 pieces.append(f'\n\tuint{self.declaredLocals[name]}_t {name};') | |
2304 pieces += bodyPieces | |
2267 pieces.append('\n\t}') | 2305 pieces.append('\n\t}') |
2268 if self.pc_reg: | 2306 if self.pc_reg: |
2269 pieces.append('\n\t}') | 2307 pieces.append('\n\t}') |
2270 pieces.append('\n}') | 2308 pieces.append('\n}') |
2271 body.append('\nstatic void unimplemented({pre}context *context, uint32_t target_cycle)'.format(pre = self.prefix)) | 2309 body.append('\nstatic void unimplemented({pre}context *context, uint32_t target_cycle)'.format(pre = self.prefix)) |