예제 #1
0
 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))
예제 #2
0
    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()
예제 #3
0
 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))
예제 #4
0
 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))
예제 #5
0
 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))