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