Mercurial > repos > blastem
changeset 2463:679c31768013
Fix carry flag calculation for neg instruction in CPU DSL
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 23 Feb 2024 23:09:07 -0800 |
parents | 3b1b7b272311 |
children | f9d5c137c74b |
files | cpu_dsl.py |
diffstat | 1 files changed, 22 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/cpu_dsl.py Fri Feb 23 23:08:45 2024 -0800 +++ b/cpu_dsl.py Fri Feb 23 23:09:07 2024 -0800 @@ -395,6 +395,7 @@ if destSize > size: needsSizeAdjust = True prog.sizeAdjust = size + needsCarry = needsOflow = needsHalf = False if op == '-': if flagUpdates: for flag in flagUpdates: @@ -407,13 +408,15 @@ needsOflow = True if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust): size = prog.paramSize(rawParams[1]) - if needsCarry: - size *= 2 decl,name = prog.getTemp(size) dst = prog.carryFlowDst = name prog.lastA = 0 prog.lastB = params[0] prog.lastBFlow = params[0] + if needsSizeAdjust: + return decl + '\n\t{dst} = {op}({a} & {mask});'.format( + dst = dst, a = params[0], op = op, mask = (1 << prog.sizeAdjust) - 1 + ) if needsSizeAdjust: return decl + '\n\t{dst} = ({dst} & ~{mask}) | (({op}{a}) & {mask});'.format( dst = dst, a = params[0], op = op, mask = (1 << prog.sizeAdjust) - 1 @@ -498,6 +501,23 @@ #FIXME!!!!! resultBit = 0 myRes = prog.lastA + elif prog.lastOp.op == 'neg': + if prog.carryFlowDst: + realSize = prog.getLastSize() + if realSize != prog.paramSize(prog.carryFlowDst): + lastDst = '({res} & {mask})'.format(res=lastDst, mask = (1 << realSize) - 1) + if type(storage) is tuple: + reg,storageBit = storage + reg = prog.resolveParam(reg, None, {}) + output.append('\n\t{reg} = {res} ? ({reg} | {bit}U) : ({reg} & {mask}U);'.format( + reg = reg, mask = ~(1 << storageBit), res = lastDst, bit = 1 << storageBit + )) + else: + reg = prog.resolveParam(storage, None, {}) + output.append('\n\t{reg} = {res} != 0;'.format( + reg = reg, res = lastDst + )) + continue else: resultBit = prog.getLastSize() if prog.lastOp.op == 'ror':