Mercurial > repos > blastem
comparison cpu_dsl.py @ 2599:ca8141c2d6ba
Fix masking issue in CPU DSL adc fixing issues in 68K core addx and abcd
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 09 Feb 2025 22:46:07 -0800 |
parents | 8fd2dbe34883 |
children | 251cc75574af |
comparison
equal
deleted
inserted
replaced
2598:8fd2dbe34883 | 2599:ca8141c2d6ba |
---|---|
901 else: | 901 else: |
902 return prog.resolveReg(carryStorage, None, (), False) | 902 return prog.resolveReg(carryStorage, None, (), False) |
903 | 903 |
904 def _adcCImpl(prog, params, rawParams, flagUpdates): | 904 def _adcCImpl(prog, params, rawParams, flagUpdates): |
905 needsSizeAdjust = False | 905 needsSizeAdjust = False |
906 destSize = prog.paramSize(rawParams[2]) | |
906 if len(params) > 3: | 907 if len(params) > 3: |
907 size = params[3] | 908 size = params[3] |
908 if size == 0: | 909 if size == 0: |
909 size = 8 | 910 size = 8 |
910 elif size == 1: | 911 elif size == 1: |
911 size = 16 | 912 size = 16 |
912 else: | 913 else: |
913 size = 32 | 914 size = 32 |
914 prog.lastSize = size | 915 prog.lastSize = size |
915 destSize = prog.paramSize(rawParams[2]) | |
916 if destSize > size: | 916 if destSize > size: |
917 needsSizeAdjust = True | 917 needsSizeAdjust = True |
918 prog.sizeAdjust = size | 918 prog.sizeAdjust = size |
919 else: | |
920 size = destSize | |
919 needsCarry = needsOflow = needsHalf = False | 921 needsCarry = needsOflow = needsHalf = False |
920 if flagUpdates: | 922 if flagUpdates: |
921 for flag in flagUpdates: | 923 for flag in flagUpdates: |
922 calc = prog.flags.flagCalc[flag] | 924 calc = prog.flags.flagCalc[flag] |
923 if calc == 'carry': | 925 if calc == 'carry': |
927 elif calc == 'overflow': | 929 elif calc == 'overflow': |
928 needsOflow = True | 930 needsOflow = True |
929 decl = '' | 931 decl = '' |
930 carryCheck = _getCarryCheck(prog) | 932 carryCheck = _getCarryCheck(prog) |
931 vals = '1 : 0' | 933 vals = '1 : 0' |
934 mask = (1 << size) - 1 | |
935 if prog.paramSize(rawParams[0]) > size: | |
936 if type(params[0]) is int: | |
937 a = params[0] & mask | |
938 else: | |
939 a = f'({params[0]} & {mask})' | |
940 else: | |
941 a = params[0] | |
942 if prog.paramSize(rawParams[1]) > size: | |
943 if type(params[1]) is int: | |
944 b = params[1] & mask | |
945 else: | |
946 b = f'({params[1]} & {mask})' | |
947 else: | |
948 b = params[1] | |
932 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust): | 949 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust): |
933 if len(params) <= 3: | |
934 size = prog.paramSize(rawParams[2]) | |
935 if needsCarry: | 950 if needsCarry: |
936 size *= 2 | 951 size *= 2 |
937 decl,name = prog.getTemp(size) | 952 decl,name = prog.getTemp(size) |
938 dst = prog.carryFlowDst = name | 953 dst = prog.carryFlowDst = name |
939 prog.lastA = params[0] | 954 prog.lastA = a |
940 prog.lastB = params[1] | 955 prog.lastB = b |
941 prog.lastBFlow = '(~{b})'.format(b=params[1]) | 956 prog.lastBFlow = f'(~{b})' |
942 if size == 64: | 957 if size == 64: |
943 params[0] = '((uint64_t){a})'.format(a=params[0]) | 958 a = f'((uint64_t){a})' |
944 params[1] = '((uint64_t){b})'.format(b=params[1]) | 959 b = f'((uint64_t){b})' |
945 vals = '((uint64_t)1) : ((uint64_t)0)' | 960 vals = '((uint64_t)1) : ((uint64_t)0)' |
946 elif needsSizeAdjust: | 961 elif needsSizeAdjust: |
947 decl,name = prog.getTemp(size) | 962 decl,name = prog.getTemp(size) |
948 dst = params[2] | 963 dst = params[2] |
949 return '{decl}\n\t{tmp} = ({a} & {mask}) + ({b} & {mask}) + ({check} ? 1 : 0);\n\t{dst} = ({dst} & ~{mask}) | {tmp};'.format( | 964 return f'{decl}\n\t{tmp} = {a} + {b} + ({carryCheck} ? 1 : 0);\n\t{dst} = ({dst} & ~{mask}) | {tmp};' |
950 decl = decl, tmp = name, a = a, b = b, op = op, dst = dst, mask = ((1 << size) - 1), check = carryCheck | |
951 ) | |
952 else: | 965 else: |
953 dst = params[2] | 966 dst = params[2] |
954 return decl + '\n\t{dst} = {a} + {b} + ({check} ? {vals});'.format(dst = dst, | 967 return decl + f'\n\t{dst} = {a} + {b} + ({carryCheck} ? {vals});' |
955 a = params[0], b = params[1], check = carryCheck, vals = vals | |
956 ) | |
957 | 968 |
958 def _sbcCImpl(prog, params, rawParams, flagUpdates): | 969 def _sbcCImpl(prog, params, rawParams, flagUpdates): |
959 needsSizeAdjust = False | 970 needsSizeAdjust = False |
960 destSize = prog.paramSize(rawParams[2]) | 971 destSize = prog.paramSize(rawParams[2]) |
961 if len(params) > 3: | 972 if len(params) > 3: |