def _o_addsub(self, other, builder, sub, invert=False): if isinstance(other, VFloat): a = self.o_getattr("numerator", builder) b = self.o_getattr("denominator", builder) if sub: if invert: return operators.truediv( operators.sub(operators.mul(other, b, builder), a, builder), b, builder) else: return operators.truediv( operators.sub(a, operators.mul(other, b, builder), builder), b, builder) else: return operators.truediv( operators.add(operators.mul(other, b, builder), a, builder), b, builder) else: if not isinstance(other, (VFraction, VInt)): return NotImplemented r = VFraction() if builder is not None: if isinstance(other, VInt): i = other.o_int64(builder).auto_load(builder) x, rd = self._nd(builder) y = builder.mul(rd, i) else: a, b = self._nd(builder) c, d = other._nd(builder) rd = builder.mul(b, d) x = builder.mul(a, d) y = builder.mul(c, b) if sub: if invert: rn = builder.sub(y, x) else: rn = builder.sub(x, y) else: rn = builder.add(x, y) rn, rd = _reduce(builder, rn, rd) # rd is already > 0 r.auto_store(builder, _make_ssa(builder, rn, rd)) return r
def __init__(self, builder, args): minimum, step = None, None if len(args) == 1: maximum = args[0] elif len(args) == 2: minimum, maximum = args else: minimum, maximum, step = args if minimum is None: minimum = VInt() if builder is not None: minimum.set_const_value(builder, 0) if step is None: step = VInt() if builder is not None: step.set_const_value(builder, 1) self._counter = minimum.new() self._counter.merge(maximum) self._counter.merge(step) self._minimum = self._counter.new() self._maximum = self._counter.new() self._step = self._counter.new() if builder is not None: self._minimum.alloca(builder, "irange_min") self._maximum.alloca(builder, "irange_max") self._step.alloca(builder, "irange_step") self._counter.alloca(builder, "irange_count") self._minimum.set_value(builder, minimum) self._maximum.set_value(builder, maximum) self._step.set_value(builder, step) counter_init = operators.sub(self._minimum, self._step, builder) self._counter.set_value(builder, counter_init)