def handle_mov_ind_s(self, src, s_off, dest): """Move indirect src to dest""" self.use_mem = True src, dest = self.get_src_dest(src, dest) offset = self.resolve_ref(*s_off) assert type(offset) == int self.block.add(SetScore(self.mem_addr, src)) if offset != 0: AddFn = AddScore if offset > 0 else SubScore self.block.add(AddFn(self.mem_addr, abs(offset))) self.block.add(MemGetFn(self)) self.block.add(SetScore(dest, self.mem_buf))
def _gen_for(size, func, prefix, indexparam, gen_callback, *cb_args): entry = func.create_block('entry') # Copy to local variable due to register allocation speedup index = func.preamble.define(DefineVariable(indexparam.type)) entry.add(SetScore(index, indexparam)) def pair_name(pair): return '%s_%d_%d' % (prefix, pair.min, pair.max) def branch(func, index, pair): return RangeBr(index, pair.min, pair.max, func.get_or_create_block(pair_name(pair)), None) def callback(pair): block = func.get_or_create_block(pair_name(pair)) block.defined = True if pair.left: block.add(branch(func, index, pair.left)) if pair.right: block.add(branch(func, index, pair.right)) if pair.min == pair.max: gen_callback(block, index, pair.min, *cb_args) root = generate_bin_tree(size, callback) entry.add(Call(func.get_or_create_block(pair_name(root)))) entry.add(Return()) func.end()
def handle_mov_ind(self, src, s_off, dest, d_off): """Move indirect src to indirect dest""" self.use_mem = True src, dest = self.get_src_dest(src, dest) s_off = self.resolve_ref(*s_off) d_off = self.resolve_ref(*d_off) assert type(s_off) == int assert type(d_off) == int self.block.add(SetScore(self.mem_addr, src)) if s_off != 0: AddFn = AddScore if s_off > 0 else SubScore self.block.add(AddFn(self.mem_addr, abs(s_off))) self.block.add(MemGetFn(self)) self.block.add(SetScore(self.mem_addr, dest)) if d_off != 0: AddFn = AddScore if d_off > 0 else SubScore self.block.add(AddFn(self.mem_addr, abs(d_off))) self.block.add(MemSetFn(self))
def _gen_setter(block, indexvar, indexval, arr, value): path = VirtualString('[%d]' % indexval) path_var = block.define(NBTSubPath(arr, path, value.type)) block.add(SetScore(path_var, value))
def _gen_getter(block, indexvar, indexval, arr, retvar): path = VirtualString('[%d]' % indexval) path_var = block.define(NBTSubPath(arr, path, retvar.type)) block.add(SetScore(retvar, path_var))