Mercurial > repos > blastem
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]) |