Author: Armin Rigo <ar...@tunes.org> Branch: optimize-cond-call Changeset: r79437:a1a3a320498a Date: 2015-09-04 18:16 +0200 http://bitbucket.org/pypy/pypy/changeset/a1a3a320498a/
Log: arm: test_*_and_guards* diff --git a/rpython/jit/backend/arm/conditions.py b/rpython/jit/backend/arm/conditions.py --- a/rpython/jit/backend/arm/conditions.py +++ b/rpython/jit/backend/arm/conditions.py @@ -19,6 +19,7 @@ def get_opposite_of(operation): + assert operation >= 0 return opposites[operation] # see mapping for floating poin according to diff --git a/rpython/jit/backend/arm/helper/assembler.py b/rpython/jit/backend/arm/helper/assembler.py --- a/rpython/jit/backend/arm/helper/assembler.py +++ b/rpython/jit/backend/arm/helper/assembler.py @@ -81,6 +81,7 @@ return fcond f.__name__ = 'emit_op_%s' % name return f + def gen_emit_unary_float_op(name, opname): op_rr = getattr(InstrBuilder, opname) def f(self, op, arglocs, regalloc, fcond): 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 @@ -203,9 +203,15 @@ fcond=fcond) return token - def _emit_guard(self, op, arglocs, fcond, save_exc, + def _emit_guard(self, op, arglocs, save_exc, is_guard_not_invalidated=False, is_guard_not_forced=False): + if is_guard_not_invalidated: + fcond = c.cond_none + else: + fcond = self.guard_success_cc + self.guard_success_cc = c.cond_none + assert fcond != c.cond_none pos = self.mc.currpos() token = self.build_guard_token(op, arglocs[0].value, arglocs[1:], pos, fcond, save_exc, is_guard_not_invalidated, @@ -231,17 +237,12 @@ return fcond def emit_op_guard_true(self, op, arglocs, regalloc, fcond): - l0 = arglocs[0] - failargs = arglocs[1:] - self.mc.CMP_ri(l0.value, 0) - fcond = self._emit_guard(op, failargs, c.NE, save_exc=False) + fcond = self._emit_guard(op, arglocs, save_exc=False) return fcond def emit_op_guard_false(self, op, arglocs, regalloc, fcond): - l0 = arglocs[0] - failargs = arglocs[1:] - self.mc.CMP_ri(l0.value, 0) - fcond = self._emit_guard(op, failargs, c.EQ, save_exc=False) + self.guard_success_cc = c.get_opposite_of(self.guard_success_cc) + fcond = self._emit_guard(op, arglocs, save_exc=False) return fcond def emit_op_guard_value(self, 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 @@ -5,6 +5,7 @@ RegisterManager, TempBox, compute_vars_longevity, BaseRegalloc, \ get_scale from rpython.jit.backend.arm import registers as r +from rpython.jit.backend.arm import conditions as c from rpython.jit.backend.arm import locations from rpython.jit.backend.arm.locations import imm, get_fp_offset from rpython.jit.backend.arm.helper.regalloc import (prepare_op_by_helper_call, @@ -656,14 +657,25 @@ locs = [imm(fail_descr)] return locs - def prepare_op_guard_true(self, op, fcond): - l0 = self.make_sure_var_in_reg(op.getarg(0)) - args = self._prepare_guard(op, [l0]) + def load_condition_into_cc(self, box): + if self.assembler.guard_success_cc == c.cond_none: + loc = self.loc(box) + if not loc.is_core_reg(): + assert loc.is_stack() + self.assembler.regalloc_mov(loc, r.lr) + loc = r.lr + self.mc.CMP_ri(loc.value, 0) + self.assembler.guard_success_cc = c.NE + + def _prepare_guard_cc(self, op, fcond): + self.load_condition_into_cc(op.getarg(0)) + args = self._prepare_guard(op, []) return args - prepare_op_guard_false = prepare_op_guard_true - prepare_op_guard_nonnull = prepare_op_guard_true - prepare_op_guard_isnull = prepare_op_guard_true + prepare_op_guard_true = _prepare_guard_cc + prepare_op_guard_false = _prepare_guard_cc + prepare_op_guard_nonnull = _prepare_guard_cc + prepare_op_guard_isnull = _prepare_guard_cc def prepare_op_guard_value(self, op, fcond): boxes = op.getarglist() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit