Author: hager <[email protected]>
Branch: ppc-jit-backend
Changeset: r46597:2b9e8d673bea
Date: 2011-08-18 12:11 +0200
http://bitbucket.org/pypy/pypy/changeset/2b9e8d673bea/
Log: Implemented GUARD_NO_OVERFLOW instruction and fixed mechanism for
remembering descr objects.
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
@@ -921,7 +921,6 @@
opname = trace_op.getopname()
op_method = self.oplist[opnum]
if trace_op.is_guard():
- #self.oplist[opnum](self, trace_op, cpu)
op_method(self, trace_op, cpu)
else:
if opname.startswith("int_") or opname.startswith("uint_"):
@@ -970,6 +969,22 @@
cpu.reg_map[result] = result_reg
cpu.next_free_register += 1
+ # Fetches the identifier from a descr object.
+ # If it has no identifier, then an unused identifier
+ # is generated
+ # XXX could be overwritten later on, better approach?
+ def _get_identifier_from_descr(self, descr, cpu):
+ try:
+ identifier = descr.identifier
+ except AttributeError:
+ identifier = None
+ if identifier is not None:
+ return identifier
+ keys = cpu.saved_descr.keys()
+ if keys == []:
+ return 1
+ return max(keys) + 1
+
# --------------------------------------- #
# CODE GENERATION #
# --------------------------------------- #
@@ -977,13 +992,22 @@
def emit_int_add(self, op, cpu, reg0, reg1, free_reg):
self.add(free_reg, reg0, reg1)
+ def emit_int_add_ovf(self, op, cpu, reg0, reg1, free_reg):
+ self.addo(free_reg, reg0, reg1)
+
def emit_int_sub(self, op, cpu, reg0, reg1, free_reg):
self.sub(free_reg, reg0, reg1)
+ def emit_int_sub_ovf(self, op, cpu, reg0, reg1, free_reg):
+ self.subfo(free_reg, reg1, reg0)
+
def emit_int_mul(self, op, cpu, reg0, reg1, free_reg):
# XXX need to care about factors whose product needs 64 bit
self.mullw(free_reg, reg0, reg1)
+ def emit_int_mul_ovf(self, op, cpu, reg0, reg1, free_reg):
+ self.mullwo(free_reg, reg0, reg1)
+
def emit_int_floordiv(self, op, cpu, reg0, reg1, free_reg):
self.divw(free_reg, reg0, reg1)
@@ -1093,15 +1117,12 @@
arg0 = op.getarg(0)
regnum = cpu.reg_map[arg0]
self.cmpi(0, 1, regnum, 0)
-
- fail_index = len(cpu.saved_descr)
fail_descr = op.getdescr()
+ fail_index = self._get_identifier_from_descr(fail_descr, cpu)
fail_descr.index = fail_index
cpu.saved_descr[fail_index] = fail_descr
-
numops = self.get_number_of_ops()
self.beq(0)
-
failargs = op.getfailargs()
reglist = []
for failarg in failargs:
@@ -1109,22 +1130,18 @@
reglist.append(None)
else:
reglist.append(cpu.reg_map[failarg])
-
cpu.patch_list.append((numops, fail_index, op, reglist))
def emit_guard_false(self, op, cpu):
arg0 = op.getarg(0)
regnum = cpu.reg_map[arg0]
self.cmpi(0, 1, regnum, 1)
-
- fail_index = len(cpu.saved_descr)
fail_descr = op.getdescr()
+ fail_index = self._get_identifier_from_descr(fail_descr, cpu)
fail_descr.index = fail_index
cpu.saved_descr[fail_index] = fail_descr
-
numops = self.get_number_of_ops()
self.beq(0)
-
failargs = op.getfailargs()
reglist = []
for failarg in failargs:
@@ -1132,13 +1149,32 @@
reglist.append(None)
else:
reglist.append(cpu.reg_map[failarg])
+ cpu.patch_list.append((numops, fail_index, op, reglist))
+ def emit_guard_no_overflow(self, op, cpu):
+ free_reg = cpu.next_free_register
+ self.mfxer(free_reg)
+ self.rlwinm(free_reg, free_reg, 2, 31, 31)
+ self.cmpi(0, 1, free_reg, 1)
+ fail_descr = op.getdescr()
+ fail_index = fail_descr.identifier
+ fail_descr.index = fail_index
+ cpu.saved_descr[fail_index] = fail_descr
+ numops = self.get_number_of_ops()
+ self.beq(0)
+ failargs = op.getfailargs()
+ reglist = []
+ for failarg in failargs:
+ if failarg is None:
+ reglist.append(None)
+ else:
+ reglist.append(cpu.reg_map[failarg])
cpu.patch_list.append((numops, fail_index, op, reglist))
def emit_finish(self, op, cpu):
- fail_index = len(cpu.saved_descr)
- cpu.saved_descr[fail_index] = op.getdescr()
-
+ descr = op.getdescr()
+ identifier = self._get_identifier_from_descr(descr, cpu)
+ cpu.saved_descr[identifier] = descr
args = op.getarglist()
for index, arg in enumerate(args):
if isinstance(arg, BoxInt):
@@ -1149,8 +1185,7 @@
addr = cpu.fail_boxes_int.get_addr_for_num(index)
self.load_word(cpu.next_free_register, arg.value)
self.store_reg(cpu.next_free_register, addr)
-
- self.load_word(3, 0)
+ self.load_word(3, identifier)
self.blr()
def emit_jump(self, op, cpu):
@@ -1218,7 +1253,7 @@
print [tb() - t0 for i in range(10)]
def make_operations():
- def not_implemented(builder, trace_op, cpu):
+ def not_implemented(builder, trace_op, cpu, *rest_args):
import pdb; pdb.set_trace()
oplist = [None] * (rop._LAST + 1)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit