comparison cpu_dsl.py @ 2598:8fd2dbe34883

Fix masking issues in CPU DSL sext instruction
author Michael Pavone <pavone@retrodev.com>
date Sun, 09 Feb 2025 22:37:41 -0800
parents 142bb1eb8ab2
children ca8141c2d6ba
comparison
equal deleted inserted replaced
2597:142bb1eb8ab2 2598:8fd2dbe34883
816 if size == 16: 816 if size == 16:
817 return src | 0xFF00 if src & 0x80 else src & 0x7F 817 return src | 0xFF00 if src & 0x80 else src & 0x7F
818 else: 818 else:
819 return src | 0xFFFF0000 if src & 0x8000 else src & 0x7FFF 819 return src | 0xFFFF0000 if src & 0x8000 else src & 0x7FFF
820 820
821 def _sextCImpl(prog, params, rawParms): 821 def _sextCImpl(prog, params, rawParams):
822 if params[0] == 16: 822 if not type(params[0]) is int:
823 fmt = '\n\t{dst} = {src} & 0x80 ? {src} | 0xFF00 : {src} & 0x7F;' 823 raise Exception('First param to sext must resolve to an integer')
824 else: 824 if not params[0] in (16, 32):
825 fmt = '\n\t{dst} = {src} & 0x8000 ? {src} | 0xFFFF0000 : {src} & 0x7FFF;' 825 raise Exception('First param to sext must be 16 or 32')
826 fromSize = params[0] >> 1
827 srcMask = (1 << fromSize) - 1
828 dstMask = (1 << params[0]) - 1
829 if prog.paramSize(rawParams[1]) > fromSize:
830 if type(params[1]) is int:
831 src = params[1] & srcMask
832 else:
833 src = f'({params[1]} & {srcMask})'
834 else:
835 src = params[1]
836 signBit = 1 << (fromSize - 1)
837 extend = (0xFFFFFFFF << fromSize) & dstMask
826 prog.lastSize = params[0] 838 prog.lastSize = params[0]
827 return fmt.format(src=params[1], dst=params[2]) 839 if prog.paramSize(rawParams[2]) > params[0]:
840 return f'\n\t{params[2]} = ({params[2]} & ~{dstMask}) | ({src} & {signBit} ? {src} | {extend} : {src});'
841 else:
842 return f'\n\t{params[2]} = {src} & {signBit} ? {src} | {extend} : {src};'
828 843
829 def _mulsCImpl(prog, params, rawParams, flagUpdates): 844 def _mulsCImpl(prog, params, rawParams, flagUpdates):
830 p0Size = prog.paramSize(rawParams[0]) 845 p0Size = prog.paramSize(rawParams[0])
831 p1Size = prog.paramSize(rawParams[1]) 846 p1Size = prog.paramSize(rawParams[1])
832 destSize = prog.paramSize(rawParams[2]) 847 destSize = prog.paramSize(rawParams[2])