comparison cpu_dsl.py @ 2597:142bb1eb8ab2

Fix bug in sbc in CPU DSL impacting 68K subx and sbcd
author Michael Pavone <pavone@retrodev.com>
date Sun, 09 Feb 2025 22:13:24 -0800
parents 1c493b8c513b
children 8fd2dbe34883
comparison
equal deleted inserted replaced
2596:01cd8aa40573 2597:142bb1eb8ab2
940 a = params[0], b = params[1], check = carryCheck, vals = vals 940 a = params[0], b = params[1], check = carryCheck, vals = vals
941 ) 941 )
942 942
943 def _sbcCImpl(prog, params, rawParams, flagUpdates): 943 def _sbcCImpl(prog, params, rawParams, flagUpdates):
944 needsSizeAdjust = False 944 needsSizeAdjust = False
945 destSize = prog.paramSize(rawParams[2])
945 if len(params) > 3: 946 if len(params) > 3:
946 size = params[3] 947 size = params[3]
947 if size == 0: 948 if size == 0:
948 size = 8 949 size = 8
949 elif size == 1: 950 elif size == 1:
950 size = 16 951 size = 16
951 else: 952 else:
952 size = 32 953 size = 32
953 prog.lastSize = size 954 prog.lastSize = size
954 destSize = prog.paramSize(rawParams[2])
955 if destSize > size: 955 if destSize > size:
956 needsSizeAdjust = True 956 needsSizeAdjust = True
957 prog.sizeAdjust = size 957 prog.sizeAdjust = size
958 else:
959 size = destSize
958 needsCarry = needsOflow = needsHalf = False 960 needsCarry = needsOflow = needsHalf = False
959 if flagUpdates: 961 if flagUpdates:
960 for flag in flagUpdates: 962 for flag in flagUpdates:
961 calc = prog.flags.flagCalc[flag] 963 calc = prog.flags.flagCalc[flag]
962 if calc == 'carry': 964 if calc == 'carry':
966 elif calc == 'overflow': 968 elif calc == 'overflow':
967 needsOflow = True 969 needsOflow = True
968 decl = '' 970 decl = ''
969 carryCheck = _getCarryCheck(prog) 971 carryCheck = _getCarryCheck(prog)
970 vals = '1 : 0' 972 vals = '1 : 0'
973 mask = (1 << size) - 1
974 if prog.paramSize(rawParams[0]) > size:
975 if type(params[0]) is int:
976 b = params[0] & mask
977 else:
978 b = f'({params[0]} & {mask})'
979 else:
980 b = params[0]
981 if prog.paramSize(rawParams[1]) > size:
982 if type(params[1]) is int:
983 a = params[1] & mask
984 else:
985 a = f'({params[1]} & {mask})'
986 else:
987 a = params[1]
971 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust): 988 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust):
972 size = prog.paramSize(rawParams[2])
973 if needsCarry: 989 if needsCarry:
974 size *= 2 990 size *= 2
975 decl,name = prog.getTemp(size) 991 decl,name = prog.getTemp(size)
976 dst = prog.carryFlowDst = name 992 dst = prog.carryFlowDst = name
977 prog.lastA = params[1] 993 prog.lastA = a
978 prog.lastB = params[0] 994 prog.lastB = b
979 prog.lastBFlow = params[0] 995 prog.lastBFlow = b
980 if size == 64: 996 if size == 64:
981 params[1] = '((uint64_t){a})'.format(a=params[1]) 997 a = f'((uint64_t){a})'
982 params[0] = '((uint64_t){b})'.format(b=params[0]) 998 b = f'((uint64_t){b})'
983 vals = '((uint64_t)1) : ((uint64_t)0)' 999 vals = '((uint64_t)1) : ((uint64_t)0)'
984 elif needsSizeAdjust: 1000 elif needsSizeAdjust:
985 decl,name = prog.getTemp(size) 1001 decl,name = prog.getTemp(size)
986 dst = params[2] 1002 dst = params[2]
987 return '{decl}\n\t{tmp} = ({b} & {mask}) - ({a} & {mask}) - ({check} ? 1 : 0);\n\t{dst} = ({dst} & ~{mask}) | {tmp};'.format( 1003 return f'{decl}\n\t{name} = {a} - {b} - ({carryCheck} ? 1 : 0);\n\t{dst} = ({dst} & ~{mask}) | {tmp};'
988 decl = decl, tmp = name, a = params[0], b = params[1], dst = dst, mask = ((1 << size) - 1), check = carryCheck
989 )
990 else: 1004 else:
991 dst = params[2] 1005 dst = params[2]
992 return decl + '\n\t{dst} = {b} - {a} - ({check} ? {vals});'.format(dst = dst, 1006 return decl + f'\n\t{dst} = {a} - {b} - ({_getCarryCheck(prog)} ? {vals});'
993 a = params[0], b = params[1], check=_getCarryCheck(prog), vals = vals
994 )
995 1007
996 def _rolCImpl(prog, params, rawParams, flagUpdates): 1008 def _rolCImpl(prog, params, rawParams, flagUpdates):
997 needsCarry = False 1009 needsCarry = False
998 if flagUpdates: 1010 if flagUpdates:
999 for flag in flagUpdates: 1011 for flag in flagUpdates: