[pypy-commit] pypy ppc-jit-backend: Added code for GUARD_EXCEPTION
hager
noreply at buildbot.pypy.org
Wed Dec 14 10:41:27 CET 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50487:c8e31eebcc23
Date: 2011-12-14 10:41 +0100
http://bitbucket.org/pypy/pypy/changeset/c8e31eebcc23/
Log: Added code for GUARD_EXCEPTION
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
@@ -310,6 +310,38 @@
emit_cast_ptr_to_int = emit_same_as
emit_cast_int_to_ptr = emit_same_as
+ def emit_guard_exception(self, op, arglocs, regalloc):
+ loc, loc1, resloc, pos_exc_value, pos_exception = arglocs[:5]
+ failargs = arglocs[5:]
+ self.mc.load_imm(loc1, pos_exception.value)
+
+ self.mc.alloc_scratch_reg()
+ if IS_PPC_32:
+ self.mc.lwz(r.SCRATCH.value, loc1.value, 0)
+ self.mc.cmpw(0, r.SCRATCH.value, loc.value)
+ else:
+ self.mc.ld(r.SCRATCH.value, loc1.value, 0)
+ self.mc.cmpd(0, r.SCRATCH.value, loc.value)
+ self.mc.free_scratch_reg()
+
+ self._emit_guard(op, failargs, c.EQ, save_exc=True)
+ self.mc.load_imm(loc, pos_exc_value.value)
+
+ if resloc:
+ if IS_PPC_32:
+ self.mc.lwz(resloc.value, loc.value, 0)
+ else:
+ self.mc.ld(resloc.value, loc.value, 0)
+
+ self.mc.alloc_scratch_reg(0)
+ if IS_PPC_32:
+ self.mc.stw(r.SCRATCH.value, loc.value, 0)
+ self.mc.stw(r.SCRATCH.value, loc1.value, 0)
+ else:
+ self.mc.sd(r.SCRATCH.value, loc.value, 0)
+ self.mc.sd(r.SCRATCH.value, loc1.value, 0)
+ self.mc.free_scratch_reg()
+
def emit_call(self, op, args, regalloc, force_index=-1):
adr = args[0].value
arglist = op.getarglist()[1:]
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
@@ -337,6 +337,26 @@
prepare_guard_overflow = prepare_guard_no_overflow
+ def prepare_guard_exception(self, op):
+ boxes = list(op.getarglist())
+ arg0 = ConstInt(rffi.cast(lltype.Signed, op.getarg(0).getint()))
+ loc, box = self._ensure_value_is_boxed(arg0)
+ boxes.append(box)
+ box = TempInt()
+ loc1 = self.force_allocate_reg(box, boxes)
+ boxes.append(box)
+ if op.result in self.longevity:
+ resloc = self.force_allocate_reg(op.result, boxes)
+ boxes.append(op.result)
+ else:
+ resloc = None
+ pos_exc_value = imm(self.cpu.pos_exc_value())
+ pos_exception = imm(self.cpu.pos_exception())
+ arglocs = self._prepare_guard(op, [loc, loc1, resloc, pos_exc_value, pos_exception])
+ self.possibly_free_vars(boxes)
+ self.possibly_free_vars(op.getfailargs())
+ return arglocs
+
def prepare_guard_value(self, op):
boxes = list(op.getarglist())
b0, b1 = boxes
More information about the pypy-commit
mailing list