[pypy-commit] pypy arm-backend-2: merge guards with cmp ops for floats

bivab noreply at buildbot.pypy.org
Tue Oct 25 11:07:58 CEST 2011


Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r48421:7b6405557495
Date: 2011-10-25 11:07 +0200
http://bitbucket.org/pypy/pypy/changeset/7b6405557495/

Log:	merge guards with cmp ops for floats

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
@@ -100,6 +100,21 @@
         return fcond
     return f
 
+def gen_emit_float_cmp_op_guard(guard_cond):
+    def f(self, op, guard, arglocs, regalloc, fcond):
+        arg1 = arglocs[0]
+        arg2 = arglocs[1]
+        inv = c.get_opposite_of(guard_cond)
+        self.mc.VCMP(arg1.value, arg2.value)
+        self.mc.VMRS(cond=fcond)
+        cond = guard_cond
+        guard_opnum = guard.getopnum()
+        if guard_opnum == rop.GUARD_FALSE:
+            cond = inv
+        self._emit_guard(guard, arglocs[2:], cond)
+        return fcond
+    return f
+
 class saved_registers(object):
     def __init__(self, assembler, regs_to_save, vfp_regs_to_save=None, regalloc=None):
         assert regalloc is None
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
@@ -56,21 +56,42 @@
         f.__name__ = name
     return f
 
-def prepare_float_op(name=None, base=True, float_result=True):
-    def f(self, op, fcond):
-        locs = []
-        loc1, box1 = self._ensure_value_is_boxed(op.getarg(0))
-        locs.append(loc1)
-        if base:
-            loc2, box2 = self._ensure_value_is_boxed(op.getarg(1))
-            locs.append(loc2)
-            self.possibly_free_var(box2)
-        self.possibly_free_var(box1)
-        res = self.force_allocate_reg(op.result)
-        assert float_result == (op.result.type == FLOAT)
-        self.possibly_free_var(op.result)
-        locs.append(res)
-        return locs
+def prepare_float_op(name=None, base=True, float_result=True, guard=False):
+    if guard:
+        def f(self, op, guard_op, fcond):
+            locs = []
+            loc1, box1 = self._ensure_value_is_boxed(op.getarg(0))
+            locs.append(loc1)
+            if base:
+                loc2, box2 = self._ensure_value_is_boxed(op.getarg(1))
+                locs.append(loc2)
+                self.possibly_free_var(box2)
+            self.possibly_free_var(box1)
+            if guard_op is None:
+                res = self.force_allocate_reg(op.result)
+                assert float_result == (op.result.type == FLOAT)
+                self.possibly_free_var(op.result)
+                locs.append(res)
+                return locs
+            else:
+                args = self._prepare_guard(guard_op, locs)
+                self.possibly_free_vars(guard_op.getfailargs())
+                return args
+    else:
+        def f(self, op, fcond):
+            locs = []
+            loc1, box1 = self._ensure_value_is_boxed(op.getarg(0))
+            locs.append(loc1)
+            if base:
+                loc2, box2 = self._ensure_value_is_boxed(op.getarg(1))
+                locs.append(loc2)
+                self.possibly_free_var(box2)
+            self.possibly_free_var(box1)
+            res = self.force_allocate_reg(op.result)
+            assert float_result == (op.result.type == FLOAT)
+            self.possibly_free_var(op.result)
+            locs.append(res)
+            return locs
     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
@@ -14,6 +14,7 @@
                                                     gen_emit_cmp_op_guard,
                                                     gen_emit_float_op,
                                                     gen_emit_float_cmp_op,
+                                                    gen_emit_float_cmp_op_guard,
                                                     gen_emit_unary_float_op, 
                                                     saved_registers,
                                                     count_reg_args)
@@ -1157,6 +1158,13 @@
     emit_op_float_gt = gen_emit_float_cmp_op(c.GT)
     emit_op_float_ge = gen_emit_float_cmp_op(c.GE)
 
+    emit_guard_float_lt = gen_emit_float_cmp_op_guard(c.VFP_LT)
+    emit_guard_float_le = gen_emit_float_cmp_op_guard(c.VFP_LE)
+    emit_guard_float_eq = gen_emit_float_cmp_op_guard(c.EQ)
+    emit_guard_float_ne = gen_emit_float_cmp_op_guard(c.NE)
+    emit_guard_float_gt = gen_emit_float_cmp_op_guard(c.GT)
+    emit_guard_float_ge = gen_emit_float_cmp_op_guard(c.GE)
+
     def emit_op_cast_float_to_int(self, op, arglocs, regalloc, fcond):
         arg, temp, res = arglocs
         self.mc.VCVT_float_to_int(temp.value, arg.value)
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
@@ -1143,18 +1143,25 @@
         ofs += descr.fielddescr.offset
         return ofs, itemsize, fieldsize, sign
 
-    prepare_op_float_add = prepare_float_op(name='float_add')
-    prepare_op_float_sub = prepare_float_op(name='float_sub')
-    prepare_op_float_mul = prepare_float_op(name='float_mul')
-    prepare_op_float_truediv = prepare_float_op(name='float_truediv')
-    prepare_op_float_lt = prepare_float_op(float_result=False, name='float_lt')
-    prepare_op_float_le = prepare_float_op(float_result=False, name='float_le')
-    prepare_op_float_eq = prepare_float_op(float_result=False, name='float_eq')
-    prepare_op_float_ne = prepare_float_op(float_result=False, name='float_ne')
-    prepare_op_float_gt = prepare_float_op(float_result=False, name='float_gt')
-    prepare_op_float_ge = prepare_float_op(float_result=False, name='float_ge')
-    prepare_op_float_neg = prepare_float_op(base=False, name='float_neg')
-    prepare_op_float_abs = prepare_float_op(base=False, name='float_abs')
+    prepare_op_float_add = prepare_float_op(name='prepare_op_float_add')
+    prepare_op_float_sub = prepare_float_op(name='prepare_op_float_sub')
+    prepare_op_float_mul = prepare_float_op(name='prepare_op_float_mul')
+    prepare_op_float_truediv = prepare_float_op(name='prepare_op_float_truediv')
+    prepare_op_float_lt = prepare_float_op(float_result=False, name='prepare_op_float_lt')
+    prepare_op_float_le = prepare_float_op(float_result=False, name='prepare_op_float_le')
+    prepare_op_float_eq = prepare_float_op(float_result=False, name='prepare_op_float_eq')
+    prepare_op_float_ne = prepare_float_op(float_result=False, name='prepare_op_float_ne')
+    prepare_op_float_gt = prepare_float_op(float_result=False, name='prepare_op_float_gt')
+    prepare_op_float_ge = prepare_float_op(float_result=False, name='prepare_op_float_ge')
+    prepare_op_float_neg = prepare_float_op(base=False, name='prepare_op_float_neg')
+    prepare_op_float_abs = prepare_float_op(base=False, name='prepare_op_float_abs')
+
+    prepare_guard_float_lt = prepare_float_op(guard=True, float_result=False, name='prepare_guard_float_lt')
+    prepare_guard_float_le = prepare_float_op(guard=True, float_result=False, name='prepare_guard_float_le')
+    prepare_guard_float_eq = prepare_float_op(guard=True, float_result=False, name='prepare_guard_float_eq')
+    prepare_guard_float_ne = prepare_float_op(guard=True, float_result=False, name='prepare_guard_float_ne')
+    prepare_guard_float_gt = prepare_float_op(guard=True, float_result=False, name='prepare_guard_float_gt')
+    prepare_guard_float_ge = prepare_float_op(guard=True, float_result=False, name='prepare_guard_float_ge')
 
     def prepare_op_math_sqrt(self, op, fcond):
         loc, box = self._ensure_value_is_boxed(op.getarg(1))


More information about the pypy-commit mailing list