[pypy-commit] pypy ppc-jit-backend: Implemented comparison operations and refactored existing code regarding comparison operations.
hager
noreply at buildbot.pypy.org
Tue Oct 18 18:06:46 CEST 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r48211:eabb2cbd47c9
Date: 2011-10-18 18:06 +0200
http://bitbucket.org/pypy/pypy/changeset/eabb2cbd47c9/
Log: Implemented comparison operations and refactored existing code
regarding comparison operations.
diff --git a/pypy/jit/backend/ppc/ppcgen/condition.py b/pypy/jit/backend/ppc/ppcgen/condition.py
--- a/pypy/jit/backend/ppc/ppcgen/condition.py
+++ b/pypy/jit/backend/ppc/ppcgen/condition.py
@@ -5,4 +5,9 @@
EQ = 12
GE = 33
+U_LT = 50
+U_LE = 60
+U_GT = 70
+U_GE = 80
+
opposites = {LE: GT, NE: EQ, LT: GE, GE: LT, EQ: NE, GT: LE}
diff --git a/pypy/jit/backend/ppc/ppcgen/helper/assembler.py b/pypy/jit/backend/ppc/ppcgen/helper/assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/helper/assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/helper/assembler.py
@@ -1,27 +1,49 @@
import pypy.jit.backend.ppc.ppcgen.condition as c
from pypy.rlib.rarithmetic import r_uint, r_longlong, intmask
-def gen_emit_cmp_op(condition):
+def gen_emit_cmp_op(condition, signed=True):
def f(self, op, arglocs, regalloc):
l0, l1, res = arglocs
# do the comparison
- if l1.is_imm():
- self.mc.cmpwi(0, l0.value, l1.value)
+ if signed:
+ if l1.is_imm():
+ self.mc.cmpwi(0, l0.value, l1.value)
+ else:
+ self.mc.cmpw(0, l0.value, l1.value)
+
+ # After the comparison, place the result
+ # in the first bit of the CR
+ if condition == c.LT:
+ self.mc.cror(0, 0, 0)
+ elif condition == c.LE:
+ self.mc.cror(0, 0, 2)
+ elif condition == c.EQ:
+ self.mc.cror(0, 2, 2)
+ elif condition == c.GE:
+ self.mc.cror(0, 1, 2)
+ elif condition == c.GT:
+ self.mc.cror(0, 1, 1)
+ elif condition == c.NE:
+ self.mc.cror(0, 0, 1)
+ else:
+ assert 0, "condition not known"
+
else:
- self.mc.cmpw(0, l0.value, l1.value)
+ if l1.is_imm():
+ self.mc.cmpli(0, l0.value, l1.value)
+ else:
+ self.mc.cmpl(0, l0.value, l1.value)
- # After the comparison, place the result
- # in the first bit of the CR
- if condition == c.LT:
- self.mc.cror(0, 0, 0)
- elif condition == c.LE:
- self.mc.cror(0, 0, 2)
- elif condition == c.EQ:
- self.mc.cror(0, 2, 2)
- elif condition == c.GE:
- self.mc.cror(0, 1, 2)
- elif condition == c.GT:
- self.mc.cror(0, 1, 1)
+ if condition == c.U_LT:
+ self.mc.cror(0, 0, 0)
+ elif condition == c.U_LE:
+ self.mc.cror(0, 0, 2)
+ elif condition == c.U_GT:
+ self.mc.cror(0, 1, 1)
+ elif condition == c.U_GE:
+ self.mc.cror(0, 1, 2)
+ else:
+ assert 0, "condition not known"
resval = res.value
# move the content of the CR to resval
diff --git a/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py b/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py
@@ -1,7 +1,14 @@
from pypy.jit.metainterp.history import ConstInt
-def _check_imm_arg(arg):
- return isinstance(arg, ConstInt)
+def _check_imm_arg(arg, size=0xFF, allow_zero=True):
+ if isinstance(arg, ConstInt):
+ i = arg.getint()
+ if allow_zero:
+ lower_bound = i >= 0
+ else:
+ lower_bound = i > 0
+ return i <= size and lower_bound
+ return False
def prepare_cmp_op():
def f(self, op):
@@ -21,3 +28,45 @@
self.possibly_free_var(op.result)
return [l0, l1, res]
return f
+
+def prepare_binary_int_op_with_imm():
+ def f(self, op):
+ boxes = op.getarglist()
+ b0, b1 = boxes
+ imm_b0 = _check_imm_arg(b0)
+ imm_b1 = _check_imm_arg(b1)
+ if not imm_b0 and imm_b1:
+ l0, box = self._ensure_value_is_boxed(b0)
+ l1 = self.make_sure_var_in_reg(b1, [b0])
+ boxes.append(box)
+ elif imm_b0 and not imm_b1:
+ l0 = self.make_sure_var_in_reg(b0)
+ l1, box = self._ensure_value_is_boxed(b1, [b0])
+ boxes.append(box)
+ else:
+ l0, box = self._ensure_value_is_boxed(b0)
+ boxes.append(box)
+ l1, box = self._ensure_value_is_boxed(b1, [box])
+ boxes.append(box)
+ locs = [l0, l1]
+ self.possibly_free_vars(boxes)
+ res = self.force_allocate_reg(op.result)
+ return locs + [res]
+ return f
+
+def prepare_binary_int_op():
+ def f(self, op):
+ boxes = list(op.getarglist())
+ b0, b1 = boxes
+
+ reg1, box = self._ensure_value_is_boxed(b0, forbidden_vars=boxes)
+ boxes.append(box)
+ reg2, box = self._ensure_value_is_boxed(b1, forbidden_vars=boxes)
+ boxes.append(box)
+
+ self.possibly_free_vars(boxes)
+ self.possibly_free_vars_for_op(op)
+ res = self.force_allocate_reg(op.result)
+ self.possibly_free_var(op.result)
+ return [reg1, reg2, res]
+ return f
diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -112,7 +112,17 @@
else:
self.mc.divdu(res.value, l0.value, l1.value)
- emit_int_le = gen_emit_cmp_op(c.LE)
+ emit_int_le = gen_emit_cmp_op(c.LE)
+ emit_int_lt = gen_emit_cmp_op(c.LT)
+ emit_int_gt = gen_emit_cmp_op(c.GT)
+ emit_int_ge = gen_emit_cmp_op(c.GE)
+ emit_int_eq = gen_emit_cmp_op(c.EQ)
+ emit_int_ne = gen_emit_cmp_op(c.NE)
+
+ emit_uint_lt = gen_emit_cmp_op(c.U_LT, signed=False)
+ emit_uint_le = gen_emit_cmp_op(c.U_LE, signed=False)
+ emit_uint_gt = gen_emit_cmp_op(c.U_GT, signed=False)
+ emit_uint_ge = gen_emit_cmp_op(c.U_GE, signed=False)
def _emit_guard(self, op, arglocs, fcond, save_exc=False,
is_guard_not_invalidated=False):
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -399,7 +399,7 @@
self._make_prologue(regalloc_head, frame_depth)
self.write_pending_failure_recoveries()
- loop_start = self.materialize_loop(looptoken, True)
+ loop_start = self.materialize_loop(looptoken, False)
looptoken.ppc_code = loop_start + start_pos
self.process_pending_guards(loop_start)
self._teardown()
diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py b/pypy/jit/backend/ppc/ppcgen/regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py
@@ -5,7 +5,9 @@
from pypy.jit.backend.ppc.ppcgen.jump import remap_frame_layout_mixed
from pypy.jit.backend.ppc.ppcgen.locations import imm
from pypy.jit.backend.ppc.ppcgen.helper.regalloc import (_check_imm_arg,
- prepare_cmp_op)
+ prepare_cmp_op,
+ prepare_binary_int_op,
+ prepare_binary_int_op_with_imm)
from pypy.jit.metainterp.history import (INT, REF, FLOAT, Const, ConstInt,
ConstPtr, LoopToken)
from pypy.jit.metainterp.resoperation import rop
@@ -175,73 +177,31 @@
# * P R E P A R E O P E R A T I O N S *
# ******************************************************
- def prepare_int_add(self, op):
- boxes = op.getarglist()
- b0, b1 = boxes
- imm_b0 = _check_imm_arg(b0)
- imm_b1 = _check_imm_arg(b1)
- if not imm_b0 and imm_b1:
- l0, box = self._ensure_value_is_boxed(b0)
- l1 = self.make_sure_var_in_reg(b1, [b0])
- boxes.append(box)
- elif imm_b0 and not imm_b1:
- l0 = self.make_sure_var_in_reg(b0)
- l1, box = self._ensure_value_is_boxed(b1, [b0])
- boxes.append(box)
- else:
- l0, box = self._ensure_value_is_boxed(b0)
- boxes.append(box)
- l1, box = self._ensure_value_is_boxed(b1, [box])
- boxes.append(box)
- locs = [l0, l1]
- self.possibly_free_vars(boxes)
- res = self.force_allocate_reg(op.result)
- return locs + [res]
+ prepare_int_add = prepare_binary_int_op_with_imm()
+ prepare_int_sub = prepare_binary_int_op_with_imm()
+ prepare_int_floordiv = prepare_binary_int_op_with_imm()
- def prepare_int_sub(self, op):
- return self.prepare_int_add(op)
+ prepare_int_mul = prepare_binary_int_op()
+ prepare_int_mod = prepare_binary_int_op()
+ prepare_int_and = prepare_binary_int_op()
+ prepare_int_or = prepare_binary_int_op()
+ prepare_int_xor = prepare_binary_int_op()
+ prepare_int_lshift = prepare_binary_int_op()
+ prepare_int_rshift = prepare_binary_int_op()
+ prepare_uint_rshift = prepare_binary_int_op()
+ prepare_uint_floordiv = prepare_binary_int_op()
- def prepare_int_floordiv(self, op):
- return self.prepare_int_add(op)
+ prepare_int_le = prepare_cmp_op()
+ prepare_int_lt = prepare_cmp_op()
+ prepare_int_ge = prepare_cmp_op()
+ prepare_int_gt = prepare_cmp_op()
+ prepare_int_eq = prepare_cmp_op()
+ prepare_int_ne = prepare_cmp_op()
- def prepare_int_mul(self, op):
- boxes = list(op.getarglist())
- b0, b1 = boxes
-
- reg1, box = self._ensure_value_is_boxed(b0, forbidden_vars=boxes)
- boxes.append(box)
- reg2, box = self._ensure_value_is_boxed(b1, forbidden_vars=boxes)
- boxes.append(box)
-
- self.possibly_free_vars(boxes)
- self.possibly_free_vars_for_op(op)
- res = self.force_allocate_reg(op.result)
- self.possibly_free_var(op.result)
- return [reg1, reg2, res]
-
- def prepare_int_mod(self, op):
- return self.prepare_int_mul(op)
-
- def prepare_int_and(self, op):
- return self.prepare_int_mul(op)
-
- def prepare_int_or(self, op):
- return self.prepare_int_mul(op)
-
- def prepare_int_xor(self, op):
- return self.prepare_int_mul(op)
-
- def prepare_int_lshift(self, op):
- return self.prepare_int_mul(op)
-
- def prepare_int_rshift(self, op):
- return self.prepare_int_mul(op)
-
- def prepare_uint_rshift(self, op):
- return self.prepare_int_mul(op)
-
- def prepare_uint_floordiv(self, op):
- return self.prepare_int_mul(op)
+ prepare_uint_lt = prepare_cmp_op()
+ prepare_uint_le = prepare_cmp_op()
+ prepare_uint_gt = prepare_cmp_op()
+ prepare_uint_ge = prepare_cmp_op()
def prepare_finish(self, op):
args = [locations.imm(self.frame_manager.frame_depth)]
@@ -287,8 +247,6 @@
[], [], None)
return []
- prepare_int_le = prepare_cmp_op()
-
def make_operation_list():
def not_implemented(self, op, *args):
raise NotImplementedError, op
More information about the pypy-commit
mailing list