Ejemplo n.º 1
0
 def _(bs):
     ints = len([x for x in arg_types if x is type_impl.Int or x is type_impl.Str or x is Raw or x is type_impl.NoneType or isinstance(x, _FuncPtr) or x is type_impl.Bool])
     floats = len([x for x in arg_types if x is type_impl.Float])
     floats_orig = floats
     pos = 0
     for arg_type in reversed(arg_types):
         type = bs.flow.stack.pop()
         assert arg_type is type, (type, arg_type)
         if type is type_impl.Int or type is type_impl.Bool:
             ints -= 1
             bs.code += isa.mov(int_regs[ints], MemRef(registers.rsp, pos))
             pos += 8
         elif isinstance(type, _FuncPtr):
             ints -= 1
             bs.code += isa.mov(int_regs[ints], MemRef(registers.rsp, pos))
             pos += 8
         elif type is type_impl.NoneType:
             ints -= 1
             bs.code += isa.mov(int_regs[ints], 0)
         elif type is Raw:
             ints -= 1
             bs.code += isa.mov(int_regs[ints], MemRef(registers.rsp, pos))
             pos += 8
             bs.code += isa.add(int_regs[ints], 8)
         elif type is type_impl.Float:
             floats -= 1
             bs.code += isa.movsd(float_regs[floats], MemRef(registers.rsp, pos))
             pos += 8
         elif type is type_impl.Str:
             ints -= 1
             bs.code += isa.mov(int_regs[ints], MemRef(registers.rsp, pos))
             bs.code += isa.test(int_regs[ints], 1)
             short = bs.program.get_unique_label()
             end = bs.program.get_unique_label()
             bs.code += isa.jnz(short)
             # long
             bs.code += isa.add(int_regs[ints], 8)
             bs.code += isa.jmp(end)
             bs.code += short
             # short
             bs.code += isa.shr(MemRef(registers.rsp, pos), 8)
             bs.code += isa.lea(int_regs[ints], MemRef(registers.rsp, pos, data_size=None))
             bs.code += end
             pos += 8
         else:
             assert False, type
     assert bs.flow.stack.pop() is self
     bs.code += isa.mov(registers.rbx, ctypes.cast(self.func, ctypes.c_void_p).value)
     bs.code += isa.mov(registers.r12, registers.rsp)
     bs.code += isa.and_(registers.rsp, -16)
     bs.code += isa.mov(registers.rax, floats)
     bs.code += isa.call(registers.rbx)
     bs.code += isa.mov(registers.rsp, registers.r12)
     bs.code += isa.add(registers.rsp, pos)
     bs.code += isa.push(registers.rax)
     bs.flow.stack.append(type_impl.Int)
Ejemplo n.º 2
0
 def cleanup(self):
   """Do end-of-loop iterator code"""
   # Update the current count
   if self.r_step is not None:
     if isinstance(self.r_count, memory.MemRef) and isinstance(self.r_step, memory.MemRef):
       self.code.add(x86_64.movsd(self.r_clobber, self.r_count))
       self.code.add(x86_64.addsd(self.r_clobber, self.r_step))
     else:
       self.code.add(x86_64.addsd(self.r_count, self.r_step))
   return
Ejemplo n.º 3
0
 def cleanup(self):
     """Do end-of-loop iterator code"""
     # Update the current count
     if self.r_step is not None:
         if isinstance(self.r_count, memory.MemRef) and isinstance(
                 self.r_step, memory.MemRef):
             self.code.add(x86_64.movsd(self.r_clobber, self.r_count))
             self.code.add(x86_64.addsd(self.r_clobber, self.r_step))
         else:
             self.code.add(x86_64.addsd(self.r_count, self.r_step))
     return
Ejemplo n.º 4
0
  def start(self, align = True):

    if self.external_start:
      if self.r_start == None:
        raise Exception('No external start register was specified.')
      if isinstance(self.r_count, memory.MemRef) and isinstance(self.r_start, memory.MemRef):
        self.code.add(x86_64.movsd(self.r_clobber, self.r_start))
        self.code.add(x86_64.movsd(self.r_count, self.r_clobber))
      else:
        if self.mode == INC:
          util.load_double(self.code, self.r_count, self.get_start())
        else:
          util.load_double(self.code, self.r_count, self.n)

    # Label
    self.start_label = self.code.prgm.get_unique_label("SYN_ITER_START")
    self.code.add(self.start_label)
    
    # Create continue/branch labels so they can be referenced; they will be
    # added to the code in their appropriate locations.
    self.continue_label = self.code.prgm.get_unique_label("SYN_ITER_CONTINUE")
    return
Ejemplo n.º 5
0
    def start(self, align=True):

        if self.external_start:
            if self.r_start == None:
                raise Exception('No external start register was specified.')
            if isinstance(self.r_count, memory.MemRef) and isinstance(
                    self.r_start, memory.MemRef):
                self.code.add(x86_64.movsd(self.r_clobber, self.r_start))
                self.code.add(x86_64.movsd(self.r_count, self.r_clobber))
            else:
                if self.mode == INC:
                    util.load_double(self.code, self.r_count, self.get_start())
                else:
                    util.load_double(self.code, self.r_count, self.n)

        # Label
        self.start_label = self.code.prgm.get_unique_label("SYN_ITER_START")
        self.code.add(self.start_label)

        # Create continue/branch labels so they can be referenced; they will be
        # added to the code in their appropriate locations.
        self.continue_label = self.code.prgm.get_unique_label(
            "SYN_ITER_CONTINUE")
        return
Ejemplo n.º 6
0
 def _(bs):
     ints = len([
         x for x in arg_types if x is type_impl.Int
         or x is type_impl.Str or x is Raw or x is type_impl.NoneType
         or isinstance(x, _FuncPtr) or x is type_impl.Bool
     ])
     floats = len([x for x in arg_types if x is type_impl.Float])
     floats_orig = floats
     pos = 0
     for arg_type in reversed(arg_types):
         type = bs.flow.stack.pop()
         assert arg_type is type, (type, arg_type)
         if type is type_impl.Int or type is type_impl.Bool:
             ints -= 1
             bs.code += isa.mov(int_regs[ints],
                                MemRef(registers.rsp, pos))
             pos += 8
         elif isinstance(type, _FuncPtr):
             ints -= 1
             bs.code += isa.mov(int_regs[ints],
                                MemRef(registers.rsp, pos))
             pos += 8
         elif type is type_impl.NoneType:
             ints -= 1
             bs.code += isa.mov(int_regs[ints], 0)
         elif type is Raw:
             ints -= 1
             bs.code += isa.mov(int_regs[ints],
                                MemRef(registers.rsp, pos))
             pos += 8
             bs.code += isa.add(int_regs[ints], 8)
         elif type is type_impl.Float:
             floats -= 1
             bs.code += isa.movsd(float_regs[floats],
                                  MemRef(registers.rsp, pos))
             pos += 8
         elif type is type_impl.Str:
             ints -= 1
             bs.code += isa.mov(int_regs[ints],
                                MemRef(registers.rsp, pos))
             bs.code += isa.test(int_regs[ints], 1)
             short = bs.program.get_unique_label()
             end = bs.program.get_unique_label()
             bs.code += isa.jnz(short)
             # long
             bs.code += isa.add(int_regs[ints], 8)
             bs.code += isa.jmp(end)
             bs.code += short
             # short
             bs.code += isa.shr(MemRef(registers.rsp, pos), 8)
             bs.code += isa.lea(
                 int_regs[ints],
                 MemRef(registers.rsp, pos, data_size=None))
             bs.code += end
             pos += 8
         else:
             assert False, type
     assert bs.flow.stack.pop() is self
     bs.code += isa.mov(registers.rbx,
                        ctypes.cast(self.func, ctypes.c_void_p).value)
     bs.code += isa.mov(registers.r12, registers.rsp)
     bs.code += isa.and_(registers.rsp, -16)
     bs.code += isa.mov(registers.rax, floats)
     bs.code += isa.call(registers.rbx)
     bs.code += isa.mov(registers.rsp, registers.r12)
     bs.code += isa.add(registers.rsp, pos)
     bs.code += isa.push(registers.rax)
     bs.flow.stack.append(type_impl.Int)