Beispiel #1
0
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]))
Beispiel #2
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)
Beispiel #3
0
 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)