Mercurial > repos > blastem
comparison cpu_dsl.py @ 1711:87d4f0b4bf1d
Actually correct overflow flag calculation in CPU DSL
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 29 Jan 2019 21:26:39 -0800 |
parents | 2344b3650b38 |
children | 0264d8b288e2 |
comparison
equal
deleted
inserted
replaced
1710:2344b3650b38 | 1711:87d4f0b4bf1d |
---|---|
239 size *= 2 | 239 size *= 2 |
240 decl,name = prog.getTemp(size) | 240 decl,name = prog.getTemp(size) |
241 dst = prog.carryFlowDst = name | 241 dst = prog.carryFlowDst = name |
242 prog.lastA = a | 242 prog.lastA = a |
243 prog.lastB = b | 243 prog.lastB = b |
244 prog.lastBFlow = '(-' + b + ')' if op == '-' else b | 244 prog.lastBFlow = b if op == '-' else '(~{b})'.format(b=b) |
245 else: | 245 else: |
246 dst = params[2] | 246 dst = params[2] |
247 return decl + '\n\t{dst} = {a} {op} {b};'.format( | 247 return decl + '\n\t{dst} = {a} {op} {b};'.format( |
248 dst = dst, a = a, b = b, op = op | 248 dst = dst, a = a, b = b, op = op |
249 ) | 249 ) |
314 elif calc == 'half': | 314 elif calc == 'half': |
315 resultBit = 4 | 315 resultBit = 4 |
316 myRes = '({a} ^ {b} ^ {res})'.format(a = prog.lastA, b = prog.lastB, res = lastDst) | 316 myRes = '({a} ^ {b} ^ {res})'.format(a = prog.lastA, b = prog.lastB, res = lastDst) |
317 elif calc == 'overflow': | 317 elif calc == 'overflow': |
318 resultBit = prog.paramSize(prog.lastDst) - 1 | 318 resultBit = prog.paramSize(prog.lastDst) - 1 |
319 myRes = '((~({a} ^ {b})) & ({a} ^ {res}))'.format(a = prog.lastA, b = prog.lastBFlow, res = lastDst) | 319 myRes = '((({a} ^ {b})) & ({a} ^ {res}))'.format(a = prog.lastA, b = prog.lastBFlow, res = lastDst) |
320 else: | 320 else: |
321 resultBit = int(resultBit) | 321 resultBit = int(resultBit) |
322 if type(storage) is tuple: | 322 if type(storage) is tuple: |
323 reg,storageBit = storage | 323 reg,storageBit = storage |
324 reg = prog.resolveParam(reg, None, {}) | 324 reg = prog.resolveParam(reg, None, {}) |
438 if needsCarry: | 438 if needsCarry: |
439 size *= 2 | 439 size *= 2 |
440 decl,name = prog.getTemp(size) | 440 decl,name = prog.getTemp(size) |
441 dst = prog.carryFlowDst = name | 441 dst = prog.carryFlowDst = name |
442 prog.lastA = params[0] | 442 prog.lastA = params[0] |
443 prog.lastB = '({b} ^ ({check} ? 1 : 0))'.format(b = params[1], check = carryCheck) | 443 prog.lastB = '({b} + ({check} ? 1 : 0))'.format(b = params[1], check = carryCheck) |
444 prog.lastBFlow = prog.lastB | 444 prog.lastBFlow = '(~{b})'.format(b=params[1]) |
445 else: | 445 else: |
446 dst = params[2] | 446 dst = params[2] |
447 return decl + '\n\t{dst} = {a} + {b} + ({check} ? 1 : 0);'.format(dst = dst, | 447 return decl + '\n\t{dst} = {a} + {b} + ({check} ? 1 : 0);'.format(dst = dst, |
448 a = params[0], b = params[1], check = carryCheck | 448 a = params[0], b = params[1], check = carryCheck |
449 ) | 449 ) |
467 size *= 2 | 467 size *= 2 |
468 decl,name = prog.getTemp(size) | 468 decl,name = prog.getTemp(size) |
469 dst = prog.carryFlowDst = name | 469 dst = prog.carryFlowDst = name |
470 prog.lastA = params[1] | 470 prog.lastA = params[1] |
471 prog.lastB = '({b} ^ ({check} ? 1 : 0))'.format(b = params[0], check = carryCheck) | 471 prog.lastB = '({b} ^ ({check} ? 1 : 0))'.format(b = params[0], check = carryCheck) |
472 prog.lastBFlow = '((-{b}) ^ ({check} ? -1 : 0))'.format(b = params[0], check = carryCheck) | 472 prog.lastBFlow = params[0] |
473 else: | 473 else: |
474 dst = params[2] | 474 dst = params[2] |
475 return decl + '\n\t{dst} = {b} - {a} - ({check} ? 1 : 0);'.format(dst = dst, | 475 return decl + '\n\t{dst} = {b} - {a} - ({check} ? 1 : 0);'.format(dst = dst, |
476 a = params[0], b = params[1], check=_getCarryCheck(prog) | 476 a = params[0], b = params[1], check=_getCarryCheck(prog) |
477 ) | 477 ) |