Author: David Schneider <david.schnei...@picle.org> Branch: arm-backend-2 Changeset: r48439:3c00e205750e Date: 2011-10-25 16:31 +0200 http://bitbucket.org/pypy/pypy/changeset/3c00e205750e/
Log: add functions to merge unary cmp operatios with guards diff --git a/pypy/jit/backend/arm/helper/assembler.py b/pypy/jit/backend/arm/helper/assembler.py --- a/pypy/jit/backend/arm/helper/assembler.py +++ b/pypy/jit/backend/arm/helper/assembler.py @@ -17,6 +17,21 @@ f.__name__ = 'emit_op_%s' % name return f +def gen_emit_guard_unary_cmp(name, true_cond, false_cond): + def f(self, op, guard, arglocs, regalloc, fcond): + assert fcond is not None + assert guard is not None + reg = arglocs[0] + self.mc.CMP_ri(reg.value, 0) + cond = true_cond + guard_opnum = guard.getopnum() + if guard_opnum == rop.GUARD_FALSE: + cond = false_cond + self._emit_guard(guard, arglocs[1:], cond) + return fcond + f.__name__ = 'emit_guard_%s' % name + return f + def gen_emit_op_ri(name, opname): ri_op = getattr(AbstractARMv7Builder, '%s_ri' % opname) rr_op = getattr(AbstractARMv7Builder, '%s_rr' % opname) @@ -77,7 +92,6 @@ self._emit_guard(guard, arglocs[2:], cond) return fcond f.__name__ = 'emit_guard_%s' % name - f.__name__ = 'emit_op_%s' % name return f def gen_emit_float_op(name, opname): @@ -86,6 +100,7 @@ arg1, arg2, result = arglocs op_rr(self.mc, result.value, arg1.value, arg2.value) return fcond + f.__name__ = 'emit_op_%s' % name return f def gen_emit_unary_float_op(name, opname): op_rr = getattr(AbstractARMv7Builder, opname) diff --git a/pypy/jit/backend/arm/helper/regalloc.py b/pypy/jit/backend/arm/helper/regalloc.py --- a/pypy/jit/backend/arm/helper/regalloc.py +++ b/pypy/jit/backend/arm/helper/regalloc.py @@ -15,18 +15,6 @@ return i <= size and lower_bound return False -def prepare_op_unary_cmp(name=None): - def f(self, op, fcond): - assert fcond is not None - a0 = op.getarg(0) - reg, box = self._ensure_value_is_boxed(a0) - res = self.force_allocate_reg(op.result, [box]) - self.possibly_free_vars([a0, box, op.result]) - return [reg, res] - if name: - f.__name__ = name - return f - def prepare_op_ri(name=None, imm_size=0xFF, commutative=True, allow_zero=True): def f(self, op, fcond): assert fcond is not None @@ -146,3 +134,20 @@ if name: f.__name__ = name return f + +def prepare_op_unary_cmp(name=None): + def f(self, op, guard_op, fcond): + assert fcond is not None + a0 = op.getarg(0) + reg, box = self._ensure_value_is_boxed(a0) + if guard_op is None: + res = self.force_allocate_reg(op.result, [box]) + self.possibly_free_vars([a0, box, op.result]) + return [reg, res] + else: + args = self._prepare_guard(guard_op, [reg]) + self.possibly_free_vars(guard_op.getfailargs()) + return args + if name: + f.__name__ = name + return f diff --git a/pypy/jit/backend/arm/opassembler.py b/pypy/jit/backend/arm/opassembler.py --- a/pypy/jit/backend/arm/opassembler.py +++ b/pypy/jit/backend/arm/opassembler.py @@ -173,6 +173,9 @@ emit_op_int_is_true = gen_emit_op_unary_cmp('int_is_true', c.NE, c.EQ) emit_op_int_is_zero = gen_emit_op_unary_cmp('int_is_zero', c.EQ, c.NE) + emit_guard_int_is_true = gen_emit_guard_unary_cmp('int_is_true', c.NE, c.EQ) + emit_guard_int_is_zero = gen_emit_guard_unary_cmp('int_is_zero', c.EQ, c.NE) + def emit_op_int_invert(self, op, arglocs, regalloc, fcond): reg, res = arglocs diff --git a/pypy/jit/backend/arm/regalloc.py b/pypy/jit/backend/arm/regalloc.py --- a/pypy/jit/backend/arm/regalloc.py +++ b/pypy/jit/backend/arm/regalloc.py @@ -451,6 +451,9 @@ prepare_op_int_is_true = prepare_op_unary_cmp('int_is_true') prepare_op_int_is_zero = prepare_op_unary_cmp('int_is_zero') + prepare_guard_int_is_true = prepare_op_unary_cmp('int_is_true') + prepare_guard_int_is_zero = prepare_op_unary_cmp('int_is_zero') + def prepare_op_int_neg(self, op, fcond): l0, box = self._ensure_value_is_boxed(op.getarg(0)) self.possibly_free_var(box) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit