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

Reply via email to