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
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))
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))
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)
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)
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
def inner2(m): tmp_addr = regint.load_mem(tmp_i) load_and_store(m, tmp_addr) store_in_mem(tmp_addr + 1, tmp_i)
def load_result(): res = regint.load_mem(p_res) instructions.program.free(p_res, 'r') return res
def inner2(m): tmp_addr = regint.load_mem(tmp_i) load_and_store(m, tmp_addr) store_in_mem(tmp_addr + 1, tmp_i)
def load_result(): res = regint.load_mem(p_res) instructions.program.free(p_res, 'ci') return res