def complex_div_impl(context, builder, sig, args): """ z = c^2 + d^2 (a+bi)/(c+di) = (ac + bd) / z, (bc - ad) / z """ [cx, cy] = args complexClass = context.make_complex(sig.args[0]) x = complexClass(context, builder, value=cx) y = complexClass(context, builder, value=cy) z = complexClass(context, builder) a = x.real b = x.imag c = y.real d = y.imag ac = builder.fmul(a, c) bd = builder.fmul(b, d) ad = builder.fmul(a, d) bc = builder.fmul(b, c) cc = builder.fmul(c, c) dd = builder.fmul(d, d) zz = builder.fadd(cc, dd) ac_bd = builder.fadd(ac, bd) bc_ad = builder.fsub(bc, ad) cgutils.guard_zero(context, builder, zz) z.real = builder.fdiv(ac_bd, zz) z.imag = builder.fdiv(bc_ad, zz) return z._getvalue()
def int_udiv_impl(context, builder, sig, args): [va, vb] = args [ta, tb] = sig.args a = context.cast(builder, va, ta, sig.return_type) b = context.cast(builder, vb, tb, sig.return_type) cgutils.guard_zero(context, builder, b) return builder.udiv(a, b)
def int_sdiv_impl(context, builder, sig, args): [va, vb] = args [ta, tb] = sig.args a = context.cast(builder, va, ta, sig.return_type) b = context.cast(builder, vb, tb, sig.return_type) cgutils.guard_zero(context, builder, b) div, _ = int_divmod(context, builder, a, b) return div
def list_pop(context, builder, sig, args): inst = ListInstance(context, builder, sig.args[0], args[0]) n = inst.size cgutils.guard_zero(context, builder, n, (IndexError, "pop from empty list")) n = builder.sub(n, ir.Constant(n.type, 1)) res = inst.getitem(n) inst.resize(n) return res
def list_pop(context, builder, sig, args): inst = ListInstance(context, builder, sig.args[0], args[0]) n = inst.size cgutils.guard_zero(context, builder, n, (IndexError, "pop from empty list")) n = builder.sub(n, ir.Constant(n.type, 1)) res = inst.getitem(n) inst.incref_value(res) # incref the pop'ed element inst.clear_value(n) # clear the storage space inst.resize(n) return impl_ret_new_ref(context, builder, sig.return_type, res)
def list_pop(context, builder, sig, args): inst = ListInstance(context, builder, sig.args[0], args[0]) idx = inst.fix_index(args[1]) n = inst.size cgutils.guard_zero(context, builder, n, (IndexError, "pop from empty list")) inst.guard_index(idx, "pop index out of range") res = inst.getitem(idx) one = ir.Constant(n.type, 1) n = builder.sub(n, ir.Constant(n.type, 1)) inst.move(idx, builder.add(idx, one), builder.sub(n, idx)) inst.resize(n) return res
def real_floordiv_impl(context, builder, sig, args): x, y = args cgutils.guard_zero(context, builder, y) quot, _ = real_divmod(context, builder, x, y) return quot
def real_mod_impl(context, builder, sig, args): x, y = args cgutils.guard_zero(context, builder, y) _, rem = real_divmod(context, builder, x, y) return rem
def real_div_impl(context, builder, sig, args): cgutils.guard_zero(context, builder, args[1]) return builder.fdiv(*args)
def int_srem_impl(context, builder, sig, args): x, y = args cgutils.guard_zero(context, builder, y) _, rem = int_divmod(context, builder, x, y) return rem
def int_ufloordiv_impl(context, builder, sig, args): x, y = args cgutils.guard_zero(context, builder, y) return builder.udiv(x, y)
def int_utruediv_impl(context, builder, sig, args): x, y = args fx = builder.uitofp(x, Type.double()) fy = builder.uitofp(y, Type.double()) cgutils.guard_zero(context, builder, y) return builder.fdiv(fx, fy)