Mercurial > repos > blastem
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])) |