Author: Armin Rigo <ar...@tunes.org> Branch: optimize-cond-call Changeset: r79439:c3e40d50bd5c Date: 2015-09-04 18:30 +0200 http://bitbucket.org/pypy/pypy/changeset/c3e40d50bd5c/
Log: arm: int_xxx_ovf diff --git a/rpython/jit/backend/arm/opassembler.py b/rpython/jit/backend/arm/opassembler.py --- a/rpython/jit/backend/arm/opassembler.py +++ b/rpython/jit/backend/arm/opassembler.py @@ -111,32 +111,25 @@ return fcond #ref: http://blogs.arm.com/software-enablement/detecting-overflow-from-mul/ - def emit_guard_int_mul_ovf(self, op, guard, arglocs, regalloc, fcond): + def emit_op_int_mul_ovf(self, op, arglocs, regalloc, fcond): reg1 = arglocs[0] reg2 = arglocs[1] res = arglocs[2] - failargs = arglocs[3:] self.mc.SMULL(res.value, r.ip.value, reg1.value, reg2.value, cond=fcond) self.mc.CMP_rr(r.ip.value, res.value, shifttype=shift.ASR, imm=31, cond=fcond) - - if guard.getopnum() == rop.GUARD_OVERFLOW: - fcond = self._emit_guard(guard, failargs, c.NE, save_exc=False) - elif guard.getopnum() == rop.GUARD_NO_OVERFLOW: - fcond = self._emit_guard(guard, failargs, c.EQ, save_exc=False) - else: - assert 0 + self.guard_success_cc = c.EQ return fcond - def emit_guard_int_add_ovf(self, op, guard, arglocs, regalloc, fcond): - self.int_add_impl(op, arglocs[0:3], regalloc, fcond, flags=True) - self._emit_guard_overflow(guard, arglocs[3:], fcond) + def emit_op_int_add_ovf(self, op, arglocs, regalloc, fcond): + fcond = self.int_add_impl(op, arglocs, regalloc, fcond, flags=True) + self.guard_success_cc = c.VC return fcond - def emit_guard_int_sub_ovf(self, op, guard, arglocs, regalloc, fcond): - self.int_sub_impl(op, arglocs[0:3], regalloc, fcond, flags=True) - self._emit_guard_overflow(guard, arglocs[3:], fcond) + def emit_op_int_sub_ovf(self, op, arglocs, regalloc, fcond): + fcond = self.int_sub_impl(op, arglocs, regalloc, fcond, flags=True) + self.guard_success_cc = c.VC return fcond emit_op_int_floordiv = gen_emit_op_by_helper_call('int_floordiv', 'DIV') @@ -165,9 +158,6 @@ emit_op_ptr_eq = emit_op_instance_ptr_eq = emit_op_int_eq emit_op_ptr_ne = emit_op_instance_ptr_ne = emit_op_int_ne - emit_op_int_add_ovf = emit_op_int_add - emit_op_int_sub_ovf = emit_op_int_sub - emit_op_int_is_true = gen_emit_op_unary_cmp('int_is_true', c.NE) emit_op_int_is_zero = gen_emit_op_unary_cmp('int_is_zero', c.EQ) @@ -227,15 +217,6 @@ self.mc.BKPT() return c.AL - def _emit_guard_overflow(self, guard, failargs, fcond): - if guard.getopnum() == rop.GUARD_OVERFLOW: - fcond = self._emit_guard(guard, failargs, c.VS, save_exc=False) - elif guard.getopnum() == rop.GUARD_NO_OVERFLOW: - fcond = self._emit_guard(guard, failargs, c.VC, save_exc=False) - else: - assert 0 - return fcond - def emit_op_guard_true(self, op, arglocs, regalloc, fcond): fcond = self._emit_guard(op, arglocs, save_exc=False) return fcond @@ -265,11 +246,8 @@ emit_op_guard_nonnull = emit_op_guard_true emit_op_guard_isnull = emit_op_guard_false - def emit_op_guard_no_overflow(self, op, arglocs, regalloc, fcond): - return self._emit_guard(op, arglocs, c.VC, save_exc=False) - - def emit_op_guard_overflow(self, op, arglocs, regalloc, fcond): - return self._emit_guard(op, arglocs, c.VS, save_exc=False) + emit_op_guard_no_overflow = emit_op_guard_true + emit_op_guard_overflow = emit_op_guard_false def emit_op_guard_class(self, op, arglocs, regalloc, fcond): self._cmp_guard_class(op, arglocs, regalloc, fcond) diff --git a/rpython/jit/backend/arm/regalloc.py b/rpython/jit/backend/arm/regalloc.py --- a/rpython/jit/backend/arm/regalloc.py +++ b/rpython/jit/backend/arm/regalloc.py @@ -483,25 +483,6 @@ resloc = self.force_allocate_reg(op.result) return [argloc, imm(numbytes), resloc] - def prepare_guard_int_mul_ovf(self, op, guard, fcond): - boxes = op.getarglist() - reg1 = self.make_sure_var_in_reg(boxes[0], forbidden_vars=boxes) - reg2 = self.make_sure_var_in_reg(boxes[1], forbidden_vars=boxes) - res = self.force_allocate_reg(op.result) - return self._prepare_guard(guard, [reg1, reg2, res]) - - def prepare_guard_int_add_ovf(self, op, guard, fcond): - locs = self._prepare_op_int_add(op, fcond) - res = self.force_allocate_reg(op.result) - locs.append(res) - return self._prepare_guard(guard, locs) - - def prepare_guard_int_sub_ovf(self, op, guard, fcond): - locs = self._prepare_op_int_sub(op, fcond) - res = self.force_allocate_reg(op.result) - locs.append(res) - return self._prepare_guard(guard, locs) - prepare_op_int_floordiv = prepare_op_by_helper_call('int_floordiv') prepare_op_int_mod = prepare_op_by_helper_call('int_mod') prepare_op_uint_floordiv = prepare_op_by_helper_call('unit_floordiv') @@ -534,6 +515,7 @@ prepare_op_int_add_ovf = prepare_op_int_add prepare_op_int_sub_ovf = prepare_op_int_sub + prepare_op_int_mul_ovf = prepare_op_int_mul prepare_op_int_is_true = prepare_unary_cmp prepare_op_int_is_zero = prepare_unary_cmp @@ -699,6 +681,7 @@ prepare_op_guard_overflow = prepare_op_guard_no_overflow prepare_op_guard_not_invalidated = prepare_op_guard_no_overflow + prepare_op_guard_not_forced = prepare_op_guard_no_overflow def prepare_op_guard_exception(self, op, fcond): boxes = op.getarglist() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit