def reduce_datetime_for_unit(builder, dt_val, src_unit, dest_unit): dest_unit_code = npdatetime_helpers.DATETIME_UNITS[dest_unit] src_unit_code = npdatetime_helpers.DATETIME_UNITS[src_unit] if dest_unit_code < 2 or src_unit_code >= 2: return dt_val, src_unit # Need to compute the day ordinal for *dt_val* if src_unit_code == 0: # Years to days year_val = dt_val days_val = year_to_days(builder, year_val) else: # Months to days leap_array = cgutils.global_constant( builder, "leap_year_months_acc", leap_year_months_acc ) normal_array = cgutils.global_constant( builder, "normal_year_months_acc", normal_year_months_acc ) days = cgutils.alloca_once(builder, TIMEDELTA64) # First compute year number and month number year, month = cgutils.divmod_by_constant(builder, dt_val, 12) # Then deduce the number of days with builder.if_else(is_leap_year(builder, year)) as (then, otherwise): with then: addend = builder.load( cgutils.gep(builder, leap_array, 0, month, inbounds=True) ) builder.store(addend, days) with otherwise: addend = builder.load( cgutils.gep(builder, normal_array, 0, month, inbounds=True) ) builder.store(addend, days) days_val = year_to_days(builder, year) days_val = builder.add(days_val, builder.load(days)) if dest_unit_code == 2: # Need to scale back to weeks weeks, _ = cgutils.divmod_by_constant(builder, days_val, 7) return weeks, "W" else: return days_val, "D"
def _define_nrt_meminfo_data(module): """ Implement NRT_MemInfo_data_fast in the module. This allows LLVM to inline lookup of the data pointer. """ fn = module.get_or_insert_function(meminfo_data_ty, name="NRT_MemInfo_data_fast") builder = ir.IRBuilder(fn.append_basic_block()) [ptr] = fn.args struct_ptr = builder.bitcast(ptr, _meminfo_struct_type.as_pointer()) data_ptr = builder.load(cgutils.gep(builder, struct_ptr, 0, 3)) builder.ret(data_ptr)
def codegen(context, builder, sig, args): [tl, tindex] = sig.args [l, index] = args fnty = ir.FunctionType( ll_voidptr_type, [ll_list_type], ) fname = 'numba_list_base_ptr' fn = builder.module.get_or_insert_function(fnty, fname) fn.attributes.add('alwaysinline') fn.attributes.add('nounwind') fn.attributes.add('readonly') lp = _container_get_data(context, builder, tl, l) base_ptr = builder.call( fn, [ lp, ], ) llty = context.get_data_type(tl.item_type) casted_base_ptr = builder.bitcast(base_ptr, llty.as_pointer()) item_ptr = cgutils.gep(builder, casted_base_ptr, index) if is_none: out = builder.load(item_ptr) else: out = context.make_optional_none(builder, tl.item_type) pout = cgutils.alloca_once_value(builder, out) dm_item = context.data_model_manager[tl.item_type] item = dm_item.load_from_data_pointer(builder, item_ptr) if not borrowed: context.nrt.incref(builder, tl.item_type, item) if is_none: loaded = item else: loaded = context.make_optional_value( builder, tl.item_type, item) builder.store(loaded, pout) out = builder.load(pout) return context.make_tuple(builder, resty, [ll_status(0), out])
def random_arr(context, builder, sig, args, typing_key=typing_key): arrty = sig.return_type dtype = arrty.dtype scalar_sig = signature(dtype, *sig.args[:-1]) scalar_args = args[:-1] # Allocate array... shapes = arrayobj._parse_shape(context, builder, sig.args[-1], args[-1]) arr = arrayobj._empty_nd_impl(context, builder, arrty, shapes) # ... and populate it in natural order scalar_impl = context.get_function(typing_key, scalar_sig) with cgutils.for_range(builder, arr.nitems) as loop: val = scalar_impl(builder, scalar_args) ptr = cgutils.gep(builder, arr.data, loop.index) arrayobj.store_item(context, builder, arrty, val, ptr) return impl_ret_new_ref(context, builder, sig.return_type, arr._getvalue())
def _gep(self, idx): return cgutils.gep(self._builder, self.data, idx)