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 )