[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