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: