def _int_divmod_impl(context, builder, sig, args, zerodiv_message): va, vb = args ta, tb = sig.args ty = sig.return_type if isinstance(ty, types.UniTuple): ty = ty.dtype a = context.cast(builder, va, ta, ty) b = context.cast(builder, vb, tb, ty) quot = cgutils.alloca_once(builder, a.type, name="quot") rem = cgutils.alloca_once(builder, a.type, name="rem") with builder.if_else(cgutils.is_scalar_zero(builder, b), likely=False) as (if_zero, if_non_zero): with if_zero: if not context.error_model.fp_zero_division( builder, (zerodiv_message, )): # No exception raised => return 0 # XXX We should also set the FPU exception status, but # there's no easy way to do that from LLVM. builder.store(b, quot) builder.store(b, rem) with if_non_zero: q, r = int_divmod(context, builder, ty, a, b) builder.store(q, quot) builder.store(r, rem) return quot, rem
def slice_indices(context, builder, sig, args): length = args[1] sli = context.make_helper(builder, sig.args[0], args[0]) with builder.if_then(cgutils.is_neg_int(builder, length), likely=False): context.call_conv.return_user_exc(builder, ValueError, ("length should not be negative", )) with builder.if_then(cgutils.is_scalar_zero(builder, sli.step), likely=False): context.call_conv.return_user_exc(builder, ValueError, ("slice step cannot be zero", )) fix_slice(builder, sli, length) return context.make_tuple(builder, sig.return_type, (sli.start, sli.stop, sli.step))
def real_floordiv_impl(context, builder, sig, args, loc=None): x, y = args res = cgutils.alloca_once(builder, x.type) with builder.if_else(cgutils.is_scalar_zero(builder, y), likely=False) as (if_zero, if_non_zero): with if_zero: if not context.error_model.fp_zero_division( builder, ("division by zero", ), loc): # No exception raised => compute the +/-inf or nan result, # and set the FP exception word for Numpy warnings. quot = builder.fdiv(x, y) builder.store(quot, res) with if_non_zero: quot, _ = real_divmod(context, builder, x, y) builder.store(quot, res) return impl_ret_untracked(context, builder, sig.return_type, builder.load(res))
def real_divmod_impl(context, builder, sig, args, loc=None): x, y = args quot = cgutils.alloca_once(builder, x.type, name="quot") rem = cgutils.alloca_once(builder, x.type, name="rem") with builder.if_else(cgutils.is_scalar_zero(builder, y), likely=False) as (if_zero, if_non_zero): with if_zero: if not context.error_model.fp_zero_division( builder, ("modulo by zero", ), loc): # No exception raised => compute the nan result, # and set the FP exception word for Numpy warnings. q = builder.fdiv(x, y) r = builder.frem(x, y) builder.store(q, quot) builder.store(r, rem) with if_non_zero: q, r = real_divmod(context, builder, x, y) builder.store(q, quot) builder.store(r, rem) return cgutils.pack_array(builder, (builder.load(quot), builder.load(rem)))