comparison cpu_dsl.py @ 2609:fbb5115b1a27

Fix issues in CPU DSL that caused regressions in Z80 core
author Michael Pavone <pavone@retrodev.com>
date Sat, 15 Feb 2025 01:35:38 -0800
parents 251cc75574af
children 2de52352936c
comparison
equal deleted inserted replaced
2608:898386e48243 2609:fbb5115b1a27
349 b = params[0] 349 b = params[0]
350 else: 350 else:
351 a = params[0] 351 a = params[0]
352 b = params[1] 352 b = params[1]
353 needsSizeAdjust = False 353 needsSizeAdjust = False
354 destSize = prog.paramSize(rawParams[2])
354 if len(params) > 3: 355 if len(params) > 3:
355 size = params[3] 356 size = params[3]
356 if size == 0: 357 if size == 0:
357 size = 8 358 size = 8
358 elif size == 1: 359 elif size == 1:
359 size = 16 360 size = 16
360 else: 361 else:
361 size = 32 362 size = 32
362 prog.lastSize = size
363 destSize = prog.paramSize(rawParams[2])
364 if destSize > size: 363 if destSize > size:
365 needsSizeAdjust = True 364 needsSizeAdjust = True
366 prog.sizeAdjust = size 365 prog.sizeAdjust = size
366 else:
367 size = destSize
368 prog.lastSize = size
367 needsCarry = needsOflow = needsHalf = False 369 needsCarry = needsOflow = needsHalf = False
368 if flagUpdates: 370 if flagUpdates:
369 for flag in flagUpdates: 371 for flag in flagUpdates:
370 calc = prog.flags.flagCalc[flag] 372 calc = prog.flags.flagCalc[flag]
371 if calc == 'carry': 373 if calc == 'carry':
374 needsHalf = True 376 needsHalf = True
375 elif calc == 'overflow': 377 elif calc == 'overflow':
376 needsOflow = True 378 needsOflow = True
377 decl = '' 379 decl = ''
378 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust): 380 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust):
379 if len(params) <= 3:
380 size = prog.paramSize(rawParams[2])
381 if needsCarry and op != '>>': 381 if needsCarry and op != '>>':
382 size *= 2 382 size *= 2
383 decl,name = prog.getTemp(size) 383 decl,name = prog.getTemp(size)
384 dst = prog.carryFlowDst = name 384 dst = prog.carryFlowDst = name
385 prog.lastA = a 385 prog.lastA = a
410 def cUnaryOperator(self, op): 410 def cUnaryOperator(self, op):
411 def _impl(prog, params, rawParams, flagUpdates): 411 def _impl(prog, params, rawParams, flagUpdates):
412 dst = params[1] 412 dst = params[1]
413 decl = '' 413 decl = ''
414 needsSizeAdjust = False 414 needsSizeAdjust = False
415 destSize = prog.paramSize(rawParams[1])
415 if len(params) > 2: 416 if len(params) > 2:
416 size = params[2] 417 size = params[2]
417 if size == 0: 418 if size == 0:
418 size = 8 419 size = 8
419 elif size == 1: 420 elif size == 1:
420 size = 16 421 size = 16
421 else: 422 else:
422 size = 32 423 size = 32
423 prog.lastSize = size
424 destSize = prog.paramSize(rawParams[1])
425 if destSize > size: 424 if destSize > size:
426 needsSizeAdjust = True 425 needsSizeAdjust = True
427 prog.sizeAdjust = size 426 prog.sizeAdjust = size
427 else:
428 size = destSize
429 prog.lastSize = size
428 needsCarry = needsOflow = needsHalf = False 430 needsCarry = needsOflow = needsHalf = False
429 if op == '-': 431 if op == '-':
430 if flagUpdates: 432 if flagUpdates:
431 for flag in flagUpdates: 433 for flag in flagUpdates:
432 calc = prog.flags.flagCalc[flag] 434 calc = prog.flags.flagCalc[flag]
435 elif calc == 'half-carry': 437 elif calc == 'half-carry':
436 needsHalf = True 438 needsHalf = True
437 elif calc == 'overflow': 439 elif calc == 'overflow':
438 needsOflow = True 440 needsOflow = True
439 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust): 441 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust):
440 size = prog.paramSize(rawParams[1])
441 decl,name = prog.getTemp(size) 442 decl,name = prog.getTemp(size)
442 dst = prog.carryFlowDst = name 443 dst = prog.carryFlowDst = name
443 prog.lastA = 0 444 prog.lastA = 0
444 prog.lastB = params[0] 445 prog.lastB = params[0]
445 prog.lastBFlow = params[0] 446 prog.lastBFlow = params[0]
782 size = 8 783 size = 8
783 elif size == 1: 784 elif size == 1:
784 size = 16 785 size = 16
785 else: 786 else:
786 size = 32 787 size = 32
787 prog.lastSize = size
788 if destSize > size: 788 if destSize > size:
789 needsSizeAdjust = True 789 needsSizeAdjust = True
790 prog.sizeAdjust = size 790 prog.sizeAdjust = size
791 else: 791 else:
792 size = destSize 792 size = destSize
793 prog.lastSize = size
793 mask = 1 << (size - 1) 794 mask = 1 << (size - 1)
794 if needsCarry: 795 if needsCarry:
795 decl,name = prog.getTemp(size) 796 decl,name = prog.getTemp(size)
796 dst = prog.carryFlowDst = name 797 dst = prog.carryFlowDst = name
797 prog.lastA = params[0] 798 prog.lastA = params[0]
910 size = 8 911 size = 8
911 elif size == 1: 912 elif size == 1:
912 size = 16 913 size = 16
913 else: 914 else:
914 size = 32 915 size = 32
915 prog.lastSize = size
916 if destSize > size: 916 if destSize > size:
917 needsSizeAdjust = True 917 needsSizeAdjust = True
918 prog.sizeAdjust = size 918 prog.sizeAdjust = size
919 else: 919 else:
920 size = destSize 920 size = destSize
921 prog.lastSize = size
921 needsCarry = needsOflow = needsHalf = False 922 needsCarry = needsOflow = needsHalf = False
922 if flagUpdates: 923 if flagUpdates:
923 for flag in flagUpdates: 924 for flag in flagUpdates:
924 calc = prog.flags.flagCalc[flag] 925 calc = prog.flags.flagCalc[flag]
925 if calc == 'carry': 926 if calc == 'carry':
975 size = 8 976 size = 8
976 elif size == 1: 977 elif size == 1:
977 size = 16 978 size = 16
978 else: 979 else:
979 size = 32 980 size = 32
980 prog.lastSize = size
981 if destSize > size: 981 if destSize > size:
982 needsSizeAdjust = True 982 needsSizeAdjust = True
983 prog.sizeAdjust = size 983 prog.sizeAdjust = size
984 else: 984 else:
985 size = destSize 985 size = destSize
986 prog.lastSize = size
986 needsCarry = needsOflow = needsHalf = False 987 needsCarry = needsOflow = needsHalf = False
987 if flagUpdates: 988 if flagUpdates:
988 for flag in flagUpdates: 989 for flag in flagUpdates:
989 calc = prog.flags.flagCalc[flag] 990 calc = prog.flags.flagCalc[flag]
990 if calc == 'carry': 991 if calc == 'carry':
1046 size = 8 1047 size = 8
1047 elif size == 1: 1048 elif size == 1:
1048 size = 16 1049 size = 16
1049 else: 1050 else:
1050 size = 32 1051 size = 32
1051 prog.lastSize = size
1052 if destSize > size: 1052 if destSize > size:
1053 needsSizeAdjust = True 1053 needsSizeAdjust = True
1054 if needsCarry: 1054 if needsCarry:
1055 prog.sizeAdjust = size 1055 prog.sizeAdjust = size
1056 else: 1056 else:
1057 size = destSize 1057 size = destSize
1058 prog.lastSize = size
1058 rotMask = size - 1 1059 rotMask = size - 1
1059 if type(params[1]) is int: 1060 if type(params[1]) is int:
1060 b = params[1] & rotMask 1061 b = params[1] & rotMask
1061 mdecl = '' 1062 mdecl = ''
1062 ret = '' 1063 ret = ''
1100 size = 8 1101 size = 8
1101 elif size == 1: 1102 elif size == 1:
1102 size = 16 1103 size = 16
1103 else: 1104 else:
1104 size = 32 1105 size = 32
1105 prog.lastSize = size
1106 if destSize > size: 1106 if destSize > size:
1107 needsSizeAdjust = True 1107 needsSizeAdjust = True
1108 if needsCarry: 1108 if needsCarry:
1109 prog.sizeAdjust = size 1109 prog.sizeAdjust = size
1110 else: 1110 else:
1111 size = destSize 1111 size = destSize
1112 prog.lastSize = size
1112 carryCheck = _getCarryCheck(prog) 1113 carryCheck = _getCarryCheck(prog)
1113 if prog.paramSize(rawParams[0]) > size: 1114 if prog.paramSize(rawParams[0]) > size:
1114 mask = (1 << size) - 1 1115 mask = (1 << size) - 1
1115 a = f'({params[0]} & {mask})' 1116 a = f'({params[0]} & {mask})'
1116 else: 1117 else:
1148 size = 8 1149 size = 8
1149 elif size == 1: 1150 elif size == 1:
1150 size = 16 1151 size = 16
1151 else: 1152 else:
1152 size = 32 1153 size = 32
1153 prog.lastSize = size
1154 if destSize > size: 1154 if destSize > size:
1155 needsSizeAdjust = True 1155 needsSizeAdjust = True
1156 if needsCarry: 1156 if needsCarry:
1157 prog.sizeAdjust = size 1157 prog.sizeAdjust = size
1158 else: 1158 else:
1159 size = destSize 1159 size = destSize
1160 prog.lastSize = size
1160 rotMask = size - 1 1161 rotMask = size - 1
1161 if type(params[1]) is int: 1162 if type(params[1]) is int:
1162 b = params[1] & rotMask 1163 b = params[1] & rotMask
1163 mdecl = '' 1164 mdecl = ''
1164 ret = '' 1165 ret = ''
1202 size = 8 1203 size = 8
1203 elif size == 1: 1204 elif size == 1:
1204 size = 16 1205 size = 16
1205 else: 1206 else:
1206 size = 32 1207 size = 32
1207 prog.lastSize = size
1208 if destSize > size: 1208 if destSize > size:
1209 needsSizeAdjust = True 1209 needsSizeAdjust = True
1210 if needsCarry: 1210 if needsCarry:
1211 prog.sizeAdjust = size 1211 prog.sizeAdjust = size
1212 else: 1212 else:
1213 size = destSize 1213 size = destSize
1214 prog.lastSize = size
1214 carryCheck = _getCarryCheck(prog) 1215 carryCheck = _getCarryCheck(prog)
1215 if prog.paramSize(rawParams[0]) > size: 1216 if prog.paramSize(rawParams[0]) > size:
1216 mask = (1 << size) - 1 1217 mask = (1 << size) - 1
1217 a = f'({params[0]} & {mask})' 1218 a = f'({params[0]} & {mask})'
1218 else: 1219 else: