Mercurial > repos > blastem
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: |