from insnset import InstructionSet --- IN-PROGRESS --- class Immed: def __init__(self, *commonvalues): self.commonvalues = commonvalues def modes(self, ivm): for n in self.commonvalues: if ivm.nextarg('void', min=n, max=n) is not None: return str(n) return ivm.nextarg('word_t') class Address: def modes(self, ivm): return ivm.nextarg('word_t') class Stack: def modes(self, ivm): for i in range(len(ivm.stack)): if ivm.nextarg('void', min=i, max=i) is not None: return ivm.stack[i] n = ivm.nextarg('code_t', min=len(stack), max=255) if n is None: n = ivm.nextarg('word_t') return ivm.compute('stack_nth(%s-%d)' % (n, len(stack))) class StackRef: def modes(self, ivm): ... class IVM(InstructionSet): def insn_inv(self): x = self.pop(); self.push('~%s' % x) def insn_neg_o(self): x = self.pop(); self.push('-%s' % x) self.setflag('%s == LONG_MIN' % x) def insn_abs_o(self): x = self.pop(); self.push('%s<0 ? -%s : %s' % (x,x,x)) self.setflag('%s == LONG_MIN' % x) def insn_add(self): y = self.pop(); x = self.pop(); self.push('%s+%s' % (x,y)) def insn_add_o(self): y = self.pop(); x = self.pop(); self.push('%s+%s' % (x,y)) self.setflag('((%s+%s)^%s) < 0 && (%s^%s) >= 0' % (x,y,x,x,y)) def insn_immed(self, x=Immed(0,1)): self.push(x) def insn_s_push(self, s=Stack()): self.push(s) def insn_s_pop(self, s=StackRef()): s.write(self.pop()) def insn_flag_push(self): self.push(self.consumeflag()) def insn_cmpz(self): self.pop('x'); self.setflag('x == 0') def insn_jumpfar(self, target=Address()): self.do('nextip = (code_t*) %s;' % target) insn_jumpfar.chainable = False def insn_load1(self): self.pop('addr'); self.push('*(char*) addr') def insn_store1(self): self.pop('value'); self.pop('addr') self.do('*(char*) addr = value;') ivm = IVM(['accum']) ivm.insn_add_o() ivm.insn_add() ivm.insn_flag_push() ivm.normalize(['accum']) ivm.write()