comparison cpu_dsl.py @ 1707:a16088324f30

Less broken flag calulcation for sub instructions in CPU DSL
author Michael Pavone <pavone@retrodev.com>
date Mon, 28 Jan 2019 21:30:23 -0800
parents 9ab64ef5cba0
children 5bfed2eedc9d
comparison
equal deleted inserted replaced
1706:c2324849a5e5 1707:a16088324f30
238 if needsCarry: 238 if needsCarry:
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 + ')' if op == '-' else b
244 prog.lastWasSub = op == '-'
244 else: 245 else:
245 dst = params[2] 246 dst = params[2]
246 return decl + '\n\t{dst} = {a} {op} {b};'.format( 247 return decl + '\n\t{dst} = {a} {op} {b};'.format(
247 dst = dst, a = a, b = b, op = op 248 dst = dst, a = a, b = b, op = op
248 ) 249 )
310 resultBit = prog.paramSize(prog.lastDst) - 1 311 resultBit = prog.paramSize(prog.lastDst) - 1
311 elif calc == 'carry': 312 elif calc == 'carry':
312 resultBit = prog.paramSize(prog.lastDst) 313 resultBit = prog.paramSize(prog.lastDst)
313 elif calc == 'half': 314 elif calc == 'half':
314 resultBit = 4 315 resultBit = 4
315 myRes = '({a} ^ {b} ^ {res})'.format(a = prog.lastA, b = prog.lastB, res = lastDst) 316 fmt = '({a} ^ {b} ^ ~{res})' if prog.lastWasSub else '({a} ^ {b} ^ {res})'
317 myRes = fmt.format(a = prog.lastA, b = prog.lastB, res = lastDst)
316 elif calc == 'overflow': 318 elif calc == 'overflow':
317 resultBit = prog.paramSize(prog.lastDst) - 1 319 resultBit = prog.paramSize(prog.lastDst) - 1
318 myRes = '((~({a} ^ {b})) & ({a} ^ {res}))'.format(a = prog.lastA, b = prog.lastB, res = lastDst) 320 myRes = '((~({a} ^ {b})) & ({a} ^ {res}))'.format(a = prog.lastA, b = prog.lastB, res = lastDst)
319 else: 321 else:
320 resultBit = int(resultBit) 322 resultBit = int(resultBit)
987 self.currentScope = None 989 self.currentScope = None
988 self.lastOp = None 990 self.lastOp = None
989 self.carryFlowDst = None 991 self.carryFlowDst = None
990 self.lastA = None 992 self.lastA = None
991 self.lastB = None 993 self.lastB = None
994 self.lastWasSub = False
992 995
993 def __str__(self): 996 def __str__(self):
994 pieces = [] 997 pieces = []
995 for reg in self.regs: 998 for reg in self.regs:
996 pieces.append(str(self.regs[reg])) 999 pieces.append(str(self.regs[reg]))