示例#1
0
 def on_first_call(self, wrapped_function):
     old_block = get_tape().active_basicblock
     parent_node = get_tape().req_node
     get_tape().open_scope(lambda x: x[0], None, 'begin-' + self.name)
     block = get_tape().active_basicblock
     block.alloc_pool = defaultdict(set)
     del parent_node.children[-1]
     self.node = get_tape().req_node
     print 'Compiling function', self.name
     result = wrapped_function(*self.compile_args)
     if result is not None:
         self.result = memorize(result)
     else:
         self.result = None
     print 'Done compiling function', self.name
     p_return_address = get_tape().program.malloc(1, 'ci')
     get_tape().function_basicblocks[block] = p_return_address
     return_address = regint.load_mem(p_return_address)
     get_tape().active_basicblock.set_exit(
         instructions.jmpi(return_address, add_to_prog=False))
     self.last_sub_block = get_tape().active_basicblock
     get_tape().close_scope(old_block, parent_node, 'end-' + self.name)
     old_block.set_exit(instructions.jmp(0, add_to_prog=False),
                        get_tape().active_basicblock)
     self.basic_block = block
示例#2
0
 def wrapped_function(*compile_args):
     base = get_arg()
     bases = dict((t, regint.load_mem(base + i)) \
                      for i,t in enumerate(type_args))
     runtime_args = [None] * len(args)
     for t,i_args in type_args.iteritems():
         for i,i_arg in enumerate(i_args):
             runtime_args[i_arg] = t.load_mem(bases[t] + i)
     return self.function(*(list(compile_args) + runtime_args))
示例#3
0
 def wrapped_function(*compile_args):
     base = get_arg()
     bases = dict((t, regint.load_mem(base + i)) \
                      for i,t in enumerate(type_args))
     runtime_args = [None] * len(args)
     for t,i_args in type_args.iteritems():
         for i,i_arg in enumerate(i_args):
             runtime_args[i_arg] = t.load_mem(bases[t] + i)
     return self.function(*(list(compile_args) + runtime_args))
示例#4
0
 def inner(j):
     base = j
     step = l / k
     if k == 2:
         tmp_addr = regint.load_mem(tmp_i)
         load_and_store(base, tmp_addr)
         load_and_store(base + step, tmp_addr + 1)
         store_in_mem(tmp_addr + 2, tmp_i)
     else:
         def inner2(m):
             tmp_addr = regint.load_mem(tmp_i)
             load_and_store(m, tmp_addr)
             store_in_mem(tmp_addr + 1, tmp_i)
         range_loop(inner2, base + step, base + (k - 1) * step, step)
示例#5
0
 def inner(j):
     base = j
     step = l / k
     if k == 2:
         tmp_addr = regint.load_mem(tmp_i)
         load_and_store(base, tmp_addr)
         load_and_store(base + step, tmp_addr + 1)
         store_in_mem(tmp_addr + 2, tmp_i)
     else:
         def inner2(m):
             tmp_addr = regint.load_mem(tmp_i)
             load_and_store(m, tmp_addr)
             store_in_mem(tmp_addr + 1, tmp_i)
         range_loop(inner2, base + step, base + (k - 1) * step, step)
示例#6
0
 def on_first_call(self, wrapped_function):
     old_block = get_tape().active_basicblock
     parent_node = get_tape().req_node
     get_tape().open_scope(lambda x: x[0], None, 'begin-' + self.name)
     block = get_tape().active_basicblock
     block.alloc_pool = defaultdict(set)
     del parent_node.children[-1]
     self.node = get_tape().req_node
     print 'Compiling function', self.name
     result = wrapped_function(*self.compile_args)
     if result is not None:
         self.result = memorize(result)
     else:
         self.result = None
     print 'Done compiling function', self.name
     p_return_address = get_tape().program.malloc(1, 'ci')
     get_tape().function_basicblocks[block] = p_return_address
     return_address = regint.load_mem(p_return_address)
     get_tape().active_basicblock.set_exit(instructions.jmpi(return_address, add_to_prog=False))
     self.last_sub_block = get_tape().active_basicblock
     get_tape().close_scope(old_block, parent_node, 'end-' + self.name)
     old_block.set_exit(instructions.jmp(0, add_to_prog=False), get_tape().active_basicblock)
     self.basic_block = block
示例#7
0
 def inner2(m):
     tmp_addr = regint.load_mem(tmp_i)
     load_and_store(m, tmp_addr)
     store_in_mem(tmp_addr + 1, tmp_i)
示例#8
0
 def load_result():
     res = regint.load_mem(p_res)
     instructions.program.free(p_res, 'r')
     return res
示例#9
0
 def inner2(m):
     tmp_addr = regint.load_mem(tmp_i)
     load_and_store(m, tmp_addr)
     store_in_mem(tmp_addr + 1, tmp_i)
示例#10
0
 def load_result():
     res = regint.load_mem(p_res)
     instructions.program.free(p_res, 'ci')
     return res