def codegen_operation(funcname, instr): if instr['op'] == 'const': value = instr['value'] if instr['type'] == 'bool': value = 1 if value else 0 gen.store_stack(value, symtbl.get_offset(funcname, instr['dest'])) if instr['op'] == 'id': gen.copy_stack(symtbl.get_offset(funcname, instr['dest']), symtbl.get_offset(funcname, instr['args'][0])) if instr['op'] == 'br': gen.br(symtbl.get_offset(funcname, instr['args'][0]), instr['args'][1], instr['args'][2]) if instr['op'] == 'jmp': gen.jmp(instr['args'][0]) if instr['op'] == 'ret': gen.ret(funcname) if instr['op'] == 'print': args = instr['args'] for i in range(len(args)): if symtbl.get_type(funcname, args[i]) == 'int': gen.printint(symtbl.get_offset(funcname, args[i])) if symtbl.get_type(funcname, args[i]) == 'bool': gen.printbool(symtbl.get_offset(funcname, args[i])) if i != len(args)-1: gen.printstr('strspace') else: gen.printstr('strnewline') if instr['op'] in comparisons: gen.comparison(comparisons[instr['op']], symtbl.get_offset(funcname, instr['dest']), symtbl.get_offset(funcname, instr['args'][0]), symtbl.get_offset(funcname, instr['args'][1])) if instr['op'] in binary_oprands: gen.binary_oprand(binary_oprands[instr['op']], symtbl.get_offset(funcname, instr['dest']), symtbl.get_offset(funcname, instr['args'][0]), symtbl.get_offset(funcname, instr['args'][1])) if instr['op'] in unary_oprands: get.unary_oprand(unary_oprands[instr['op']], symtbl.get_offset(funcname, instr['dest']), symtbl.get_offset(funcname, instr['args'][0]))
def overload_op(fun, t, attr): with overload(fun, t >> (t >> t), 'lhs', 'rhs'): func = getattr(cs.builder, attr) res = func(cs.load_var('lhs'), cs.load_var('rhs')) codegen.ret(cs, res)
def overload_eq(t, attr): with overload('=', t >> (t >> boolean), 'lhs', 'rhs'): func = getattr(cs.builder, attr) res = func('==', cs.load_var('lhs'), cs.load_var('rhs')) codegen.ret(cs, res)