Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit