Mercurial > repos > blastem
changeset 2597:142bb1eb8ab2
Fix bug in sbc in CPU DSL impacting 68K subx and sbcd
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 09 Feb 2025 22:13:24 -0800 |
parents | 01cd8aa40573 |
children | 8fd2dbe34883 |
files | cpu_dsl.py |
diffstat | 1 files changed, 25 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/cpu_dsl.py Sun Feb 09 22:08:47 2025 -0800 +++ b/cpu_dsl.py Sun Feb 09 22:13:24 2025 -0800 @@ -942,6 +942,7 @@ def _sbcCImpl(prog, params, rawParams, flagUpdates): needsSizeAdjust = False + destSize = prog.paramSize(rawParams[2]) if len(params) > 3: size = params[3] if size == 0: @@ -951,10 +952,11 @@ else: size = 32 prog.lastSize = size - destSize = prog.paramSize(rawParams[2]) if destSize > size: needsSizeAdjust = True prog.sizeAdjust = size + else: + size = destSize needsCarry = needsOflow = needsHalf = False if flagUpdates: for flag in flagUpdates: @@ -968,30 +970,40 @@ decl = '' carryCheck = _getCarryCheck(prog) vals = '1 : 0' + mask = (1 << size) - 1 + if prog.paramSize(rawParams[0]) > size: + if type(params[0]) is int: + b = params[0] & mask + else: + b = f'({params[0]} & {mask})' + else: + b = params[0] + if prog.paramSize(rawParams[1]) > size: + if type(params[1]) is int: + a = params[1] & mask + else: + a = f'({params[1]} & {mask})' + else: + a = params[1] if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust): - size = prog.paramSize(rawParams[2]) if needsCarry: size *= 2 decl,name = prog.getTemp(size) dst = prog.carryFlowDst = name - prog.lastA = params[1] - prog.lastB = params[0] - prog.lastBFlow = params[0] + prog.lastA = a + prog.lastB = b + prog.lastBFlow = b if size == 64: - params[1] = '((uint64_t){a})'.format(a=params[1]) - params[0] = '((uint64_t){b})'.format(b=params[0]) + a = f'((uint64_t){a})' + b = f'((uint64_t){b})' vals = '((uint64_t)1) : ((uint64_t)0)' elif needsSizeAdjust: decl,name = prog.getTemp(size) dst = params[2] - return '{decl}\n\t{tmp} = ({b} & {mask}) - ({a} & {mask}) - ({check} ? 1 : 0);\n\t{dst} = ({dst} & ~{mask}) | {tmp};'.format( - decl = decl, tmp = name, a = params[0], b = params[1], dst = dst, mask = ((1 << size) - 1), check = carryCheck - ) + return f'{decl}\n\t{name} = {a} - {b} - ({carryCheck} ? 1 : 0);\n\t{dst} = ({dst} & ~{mask}) | {tmp};' else: dst = params[2] - return decl + '\n\t{dst} = {b} - {a} - ({check} ? {vals});'.format(dst = dst, - a = params[0], b = params[1], check=_getCarryCheck(prog), vals = vals - ) + return decl + f'\n\t{dst} = {a} - {b} - ({_getCarryCheck(prog)} ? {vals});' def _rolCImpl(prog, params, rawParams, flagUpdates): needsCarry = False