[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