Mercurial > repos > blastem
comparison cpu_dsl.py @ 2594:1c493b8c513b
Fix some rotate instruction issues in new 68K core
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 09 Feb 2025 18:07:40 -0800 |
parents | 8ef8b2e99f4f |
children | 142bb1eb8ab2 |
comparison
equal
deleted
inserted
replaced
2593:b0a7b1f708cc | 2594:1c493b8c513b |
---|---|
1024 ret = '' | 1024 ret = '' |
1025 else: | 1025 else: |
1026 mdecl,b = prog.getTemp(prog.paramSize(rawParams[1])) | 1026 mdecl,b = prog.getTemp(prog.paramSize(rawParams[1])) |
1027 ret = f'\n\t{b} = {params[1]} & {rotMask};' | 1027 ret = f'\n\t{b} = {params[1]} & {rotMask};' |
1028 prog.lastB = b | 1028 prog.lastB = b |
1029 if prog.paramSize(rawParams[0]) > size: | |
1030 mask = (1 << size) - 1 | |
1031 a = f'({params[0]} & {mask})' | |
1032 else: | |
1033 a = params[0] | |
1029 prog.lastBUnmasked = params[1] | 1034 prog.lastBUnmasked = params[1] |
1030 if needsSizeAdjust: | 1035 if needsSizeAdjust: |
1031 decl,name = prog.getTemp(size) | 1036 decl,name = prog.getTemp(size) |
1032 mdecl += decl | 1037 mdecl += decl |
1033 dst = prog.carryFlowDst = name | 1038 dst = prog.carryFlowDst = name |
1034 else: | 1039 else: |
1035 dst = params[2] | 1040 dst = params[2] |
1036 ret += '\n\t{dst} = {a} << {b} | {a} >> ({size} - {b});'.format(dst = dst, | 1041 ret += '\n\t{dst} = {a} << {b} | {a} >> ({size} - {b});'.format(dst = dst, |
1037 a = params[0], b = b, size=size | 1042 a = a, b = b, size=size |
1038 ) | 1043 ) |
1039 if needsSizeAdjust and not needsCarry: | 1044 if needsSizeAdjust and not needsCarry: |
1040 mask = (1 << size) - 1 | 1045 mask = (1 << size) - 1 |
1041 ret += f'\n\t{params[2]} = ({params[2]} & ~{mask}) | ({dst} & {mask});' | 1046 ret += f'\n\t{params[2]} = ({params[2]} & ~{mask}) | ({dst} & {mask});' |
1042 return mdecl + ret | 1047 return mdecl + ret |
1065 if needsCarry: | 1070 if needsCarry: |
1066 prog.sizeAdjust = size | 1071 prog.sizeAdjust = size |
1067 else: | 1072 else: |
1068 size = destSize | 1073 size = destSize |
1069 carryCheck = _getCarryCheck(prog) | 1074 carryCheck = _getCarryCheck(prog) |
1070 size = prog.paramSize(rawParams[2]) | 1075 if prog.paramSize(rawParams[0]) > size: |
1076 mask = (1 << size) - 1 | |
1077 a = f'({params[0]} & {mask})' | |
1078 else: | |
1079 a = params[0] | |
1071 if needsCarry or needsSizeAdjust: | 1080 if needsCarry or needsSizeAdjust: |
1072 decl,name = prog.getTemp(size) | 1081 decl,name = prog.getTemp(size) |
1073 dst = prog.carryFlowDst = name | 1082 dst = prog.carryFlowDst = name |
1074 prog.lastA = params[0] | 1083 prog.lastA = a |
1075 prog.lastB = params[1] | 1084 prog.lastB = params[1] |
1076 else: | 1085 else: |
1077 dst = params[2] | 1086 dst = params[2] |
1078 if size == 32 and (not type(params[1]) is int) or params[1] <= 1: | 1087 if size == 32 and ((not type(params[1]) is int) or params[1] <= 1): |
1079 # we may need to shift by 32-bits which is too much for a normal int | 1088 # we may need to shift by 32-bits which is too much for a normal int |
1080 a = f'((uint64_t){params[0]})' | 1089 a = f'((uint64_t){a})' |
1081 else: | |
1082 a = params[0] | |
1083 ret = decl + '\n\t{dst} = {a} << {b} | {a} >> ({size} + 1 - {b}) | ({check} ? 1 : 0) << ({b} - 1);'.format(dst = dst, | 1090 ret = decl + '\n\t{dst} = {a} << {b} | {a} >> ({size} + 1 - {b}) | ({check} ? 1 : 0) << ({b} - 1);'.format(dst = dst, |
1084 a = a, b = params[1], size=size, check=carryCheck | 1091 a = a, b = params[1], size=size, check=carryCheck |
1085 ) | 1092 ) |
1086 if needsSizeAdjust and not needsCarry: | 1093 if needsSizeAdjust and not needsCarry: |
1087 mask = (1 << size) - 1 | 1094 mask = (1 << size) - 1 |
1120 else: | 1127 else: |
1121 mdecl,b = prog.getTemp(prog.paramSize(rawParams[1])) | 1128 mdecl,b = prog.getTemp(prog.paramSize(rawParams[1])) |
1122 ret = f'\n\t{b} = {params[1]} & {rotMask};' | 1129 ret = f'\n\t{b} = {params[1]} & {rotMask};' |
1123 prog.lastB = b | 1130 prog.lastB = b |
1124 prog.lastBUnmasked = params[1] | 1131 prog.lastBUnmasked = params[1] |
1132 if prog.paramSize(rawParams[0]) > size: | |
1133 mask = (1 << size) - 1 | |
1134 a = f'({params[0]} & {mask})' | |
1135 else: | |
1136 a = params[0] | |
1125 if needsSizeAdjust: | 1137 if needsSizeAdjust: |
1126 decl,name = prog.getTemp(size) | 1138 decl,name = prog.getTemp(size) |
1127 dst = prog.carryFlowDst = name | 1139 dst = prog.carryFlowDst = name |
1128 mdecl += decl | 1140 mdecl += decl |
1129 else: | 1141 else: |
1130 dst = params[2] | 1142 dst = params[2] |
1131 ret += '\n\t{dst} = {a} >> {b} | {a} << ({size} - {b});'.format(dst = dst, | 1143 ret += '\n\t{dst} = {a} >> {b} | {a} << ({size} - {b});'.format(dst = dst, |
1132 a = params[0], b = b, size=size | 1144 a = a, b = b, size=size |
1133 ) | 1145 ) |
1134 if needsSizeAdjust and not needsCarry: | 1146 if needsSizeAdjust and not needsCarry: |
1135 mask = (1 << size) - 1 | 1147 mask = (1 << size) - 1 |
1136 ret += f'\n\t{params[2]} = ({params[2]} & ~{mask}) | ({dst} & {mask});' | 1148 ret += f'\n\t{params[2]} = ({params[2]} & ~{mask}) | ({dst} & {mask});' |
1137 return mdecl + ret | 1149 return mdecl + ret |
1160 if needsCarry: | 1172 if needsCarry: |
1161 prog.sizeAdjust = size | 1173 prog.sizeAdjust = size |
1162 else: | 1174 else: |
1163 size = destSize | 1175 size = destSize |
1164 carryCheck = _getCarryCheck(prog) | 1176 carryCheck = _getCarryCheck(prog) |
1165 size = prog.paramSize(rawParams[2]) | 1177 if prog.paramSize(rawParams[0]) > size: |
1178 mask = (1 << size) - 1 | |
1179 a = f'({params[0]} & {mask})' | |
1180 else: | |
1181 a = params[0] | |
1166 if needsCarry or needsSizeAdjust: | 1182 if needsCarry or needsSizeAdjust: |
1167 decl,name = prog.getTemp(size) | 1183 decl,name = prog.getTemp(size) |
1168 dst = prog.carryFlowDst = name | 1184 dst = prog.carryFlowDst = name |
1169 prog.lastA = params[0] | 1185 prog.lastA = a |
1170 prog.lastB = params[1] | 1186 prog.lastB = params[1] |
1171 else: | 1187 else: |
1172 dst = params[2] | 1188 dst = params[2] |
1173 if size == 32 and (not type(params[1]) is int) or params[1] <= 1: | 1189 if size == 32 and ((not type(params[1]) is int) or params[1] <= 1): |
1174 # we may need to shift by 32-bits which is too much for a normal int | 1190 # we may need to shift by 32-bits which is too much for a normal int |
1175 a = f'((uint64_t){params[0]})' | 1191 a = f'((uint64_t){a})' |
1176 else: | |
1177 a = params[0] | |
1178 ret = decl + '\n\t{dst} = {a} >> {b} | {a} << ({size} + 1 - {b}) | ({check} ? 1 : 0) << ({size}-{b});'.format(dst = dst, | 1192 ret = decl + '\n\t{dst} = {a} >> {b} | {a} << ({size} + 1 - {b}) | ({check} ? 1 : 0) << ({size}-{b});'.format(dst = dst, |
1179 a = a, b = params[1], size=size, check=carryCheck | 1193 a = a, b = params[1], size=size, check=carryCheck |
1180 ) | 1194 ) |
1181 if needsSizeAdjust and not needsCarry: | 1195 if needsSizeAdjust and not needsCarry: |
1182 mask = (1 << size) - 1 | 1196 mask = (1 << size) - 1 |