Author: David Schneider <david.schnei...@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)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit