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