def iternext_zip(context, builder, sig, args, result): [zip_type] = sig.args [zipobj] = args zipobj = context.make_helper(builder, zip_type, value=zipobj) if len(zipobj) == 0: # zip() is an empty iterator result.set_exhausted() return p_ret_tup = cgutils.alloca_once(builder, context.get_value_type(zip_type.yield_type)) p_is_valid = cgutils.alloca_once_value(builder, value=cgutils.true_bit) for i, (iterobj, srcty) in enumerate(zip(zipobj, zip_type.source_types)): is_valid = builder.load(p_is_valid) # Avoid calling the remaining iternext if a iterator has been exhausted with builder.if_then(is_valid): srcres = call_iternext(context, builder, srcty, iterobj) is_valid = builder.and_(is_valid, srcres.is_valid()) builder.store(is_valid, p_is_valid) val = srcres.yielded_value() ptr = cgutils.gep_inbounds(builder, p_ret_tup, 0, i) builder.store(val, ptr) is_valid = builder.load(p_is_valid) result.set_valid(is_valid) with builder.if_then(is_valid): result.yield_(builder.load(p_ret_tup))
def _do_load(self, builder, ptr, formal_list=None): res = [] for i, i_formal in enumerate(self._pack_map): elem_ptr = cgutils.gep_inbounds(builder, ptr, 0, i) val = self._models[i_formal].load_from_data_pointer(builder, elem_ptr) if formal_list is None: res.append((self._fe_types[i_formal], val)) else: formal_list[i_formal] = val return res
def load_from_data_pointer(self, builder, ptr, align=None): values = [] for i, model in enumerate(self._models): elem_ptr = cgutils.gep_inbounds(builder, ptr, 0, i) val = model.load_from_data_pointer(builder, elem_ptr, align) values.append(val) struct = ir.Constant(self.get_value_type(), ir.Undefined) for i, val in enumerate(values): struct = self.set(builder, struct, val, i) return struct
def get_next_int32(context, builder, state_ptr): """ Get the next int32 generated by the PRNG at *state_ptr*. """ idxptr = get_index_ptr(builder, state_ptr) idx = builder.load(idxptr) need_reshuffle = builder.icmp_unsigned(">=", idx, N_const) with cgutils.if_unlikely(builder, need_reshuffle): fn = get_rnd_shuffle(builder) builder.call(fn, (state_ptr,)) builder.store(const_int(0), idxptr) idx = builder.load(idxptr) array_ptr = get_array_ptr(builder, state_ptr) y = builder.load(cgutils.gep_inbounds(builder, array_ptr, 0, idx)) idx = builder.add(idx, const_int(1)) builder.store(idx, idxptr) # Tempering y = builder.xor(y, builder.lshr(y, const_int(11))) y = builder.xor(y, builder.and_(builder.shl(y, const_int(7)), const_int(0x9D2C5680))) y = builder.xor(y, builder.and_(builder.shl(y, const_int(15)), const_int(0xEFC60000))) y = builder.xor(y, builder.lshr(y, const_int(18))) return y
def as_data(self, builder, value): values = [builder.load(cgutils.gep_inbounds(builder, value, i)) for i in range(self._fe_type.count)] return cgutils.pack_array(builder, values)
def get_gauss_ptr(builder, state_ptr): return cgutils.gep_inbounds(builder, state_ptr, 0, 3)
def get_array_ptr(builder, state_ptr): return cgutils.gep_inbounds(builder, state_ptr, 0, 1)
def get_index_ptr(builder, state_ptr): return cgutils.gep_inbounds(builder, state_ptr, 0, 0)
def codegen(context, builder, sig, args): vtablety = ir.LiteralStructType([ ll_voidptr_type, # equal ll_voidptr_type, # key incref ll_voidptr_type, # key decref ll_voidptr_type, # val incref ll_voidptr_type, # val decref ]) setmethod_fnty = ir.FunctionType( ir.VoidType(), [ll_dict_type, vtablety.as_pointer()] ) setmethod_fn = ir.Function( builder.module, setmethod_fnty, name='numba_dict_set_method_table', ) dp = args[0] vtable = cgutils.alloca_once(builder, vtablety, zfill=True) # install key incref/decref key_equal_ptr = cgutils.gep_inbounds(builder, vtable, 0, 0) key_incref_ptr = cgutils.gep_inbounds(builder, vtable, 0, 1) key_decref_ptr = cgutils.gep_inbounds(builder, vtable, 0, 2) val_incref_ptr = cgutils.gep_inbounds(builder, vtable, 0, 3) val_decref_ptr = cgutils.gep_inbounds(builder, vtable, 0, 4) dm_key = context.data_model_manager[keyty.instance_type] if dm_key.contains_nrt_meminfo(): equal = _get_equal(context, builder.module, dm_key) key_incref, key_decref = _get_incref_decref( context, builder.module, dm_key, ) builder.store( builder.bitcast(equal, key_equal_ptr.type.pointee), key_equal_ptr, ) builder.store( builder.bitcast(key_incref, key_incref_ptr.type.pointee), key_incref_ptr, ) builder.store( builder.bitcast(key_decref, key_decref_ptr.type.pointee), key_decref_ptr, ) dm_val = context.data_model_manager[valty.instance_type] if dm_val.contains_nrt_meminfo(): val_incref, val_decref = _get_incref_decref( context, builder.module, dm_val, ) builder.store( builder.bitcast(val_incref, val_incref_ptr.type.pointee), val_incref_ptr, ) builder.store( builder.bitcast(val_decref, val_decref_ptr.type.pointee), val_decref_ptr, ) builder.call(setmethod_fn, [dp, vtable])
def as_data(self, builder, value): values = [ builder.load(cgutils.gep_inbounds(builder, value, i)) for i in range(self._fe_type.count) ] return cgutils.pack_array(builder, values)
def codegen(context, builder, sig, args): vtablety = ir.LiteralStructType([ ll_voidptr_type, # equal ll_voidptr_type, # key incref ll_voidptr_type, # key decref ll_voidptr_type, # val incref ll_voidptr_type, # val decref ]) setmethod_fnty = ir.FunctionType( ir.VoidType(), [ll_dict_type, vtablety.as_pointer()]) setmethod_fn = ir.Function( builder.module, setmethod_fnty, name='numba_dict_set_method_table', ) dp = args[0] vtable = cgutils.alloca_once(builder, vtablety, zfill=True) # install key incref/decref key_equal_ptr = cgutils.gep_inbounds(builder, vtable, 0, 0) key_incref_ptr = cgutils.gep_inbounds(builder, vtable, 0, 1) key_decref_ptr = cgutils.gep_inbounds(builder, vtable, 0, 2) val_incref_ptr = cgutils.gep_inbounds(builder, vtable, 0, 3) val_decref_ptr = cgutils.gep_inbounds(builder, vtable, 0, 4) dm_key = context.data_model_manager[keyty.instance_type] if dm_key.contains_nrt_meminfo(): equal = _get_equal(context, builder.module, dm_key) key_incref, key_decref = _get_incref_decref( context, builder.module, dm_key, ) builder.store( builder.bitcast(equal, key_equal_ptr.type.pointee), key_equal_ptr, ) builder.store( builder.bitcast(key_incref, key_incref_ptr.type.pointee), key_incref_ptr, ) builder.store( builder.bitcast(key_decref, key_decref_ptr.type.pointee), key_decref_ptr, ) dm_val = context.data_model_manager[valty.instance_type] if dm_val.contains_nrt_meminfo(): val_incref, val_decref = _get_incref_decref( context, builder.module, dm_val, ) builder.store( builder.bitcast(val_incref, val_incref_ptr.type.pointee), val_incref_ptr, ) builder.store( builder.bitcast(val_decref, val_decref_ptr.type.pointee), val_decref_ptr, ) builder.call(setmethod_fn, [dp, vtable])