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