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)
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
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
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
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
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)