[pypy-commit] pypy ppc-jit-backend: (bivab, hager): port fixes to GUARD CLASS from ARM backend

hager noreply at buildbot.pypy.org
Thu Mar 1 13:08:46 CET 2012


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r53046:921d7eb791cc
Date: 2012-03-01 03:55 -0800
http://bitbucket.org/pypy/pypy/changeset/921d7eb791cc/

Log:	(bivab, hager): port fixes to GUARD CLASS from ARM backend

diff --git a/pypy/jit/backend/ppc/opassembler.py b/pypy/jit/backend/ppc/opassembler.py
--- a/pypy/jit/backend/ppc/opassembler.py
+++ b/pypy/jit/backend/ppc/opassembler.py
@@ -241,32 +241,31 @@
     emit_guard_nonnull = emit_guard_true
     emit_guard_isnull = emit_guard_false
 
-    def _cmp_guard_class(self, op, locs, regalloc):
-        offset = locs[2]
-        if offset is not None:
-            with scratch_reg(self.mc):
-                if offset.is_imm():
-                    self.mc.load(r.SCRATCH.value, locs[0].value, offset.value)
-                else:
-                    assert offset.is_reg()
-                    self.mc.loadx(r.SCRATCH.value, locs[0].value, offset.value)
-                self.mc.cmp_op(0, r.SCRATCH.value, locs[1].value)
-        else:
-            assert 0, "not implemented yet"
-        self._emit_guard(op, locs[3:], c.NE)
-
     def emit_guard_class(self, op, arglocs, regalloc):
         self._cmp_guard_class(op, arglocs, regalloc)
         self._emit_guard(op, arglocs[3:], c.NE, save_exc=False)
 
     def emit_guard_nonnull_class(self, op, arglocs, regalloc):
-        offset = self.cpu.vtable_offset
-        self.mc.cmp_op(0, arglocs[0].value, 0, imm=True)
+        self.mc.cmp_op(0, arglocs[0].value, 1, imm=True, signed=False)
+        patch_pos = self.mc.currpos()
+        self.mc.nop()
+        self._cmp_guard_class(op, arglocs, regalloc)
+        pmc = OverwritingBuilder(self.mc, patch_pos, 1)
+        pmc.bc(12, 0, self.mc.currpos() - patch_pos)
+        pmc.overwrite()
+        self._emit_guard(op, arglocs[3:], c.NE, save_exc=False)
+
+    def _cmp_guard_class(self, op, locs, regalloc):
+        offset = locs[2]
         if offset is not None:
-            self._emit_guard(op, arglocs[3:], c.EQ)
+            #self.mc.LDR_ri(r.ip.value, locs[0].value, offset.value, cond=fcond)
+            #self.mc.CMP_rr(r.ip.value, locs[1].value, cond=fcond)
+            with scratch_reg(self.mc):
+                self.mc.load(r.SCRATCH.value, locs[0].value, offset.value)
+                self.mc.cmp_op(0, r.SCRATCH.value, locs[1].value)
         else:
             raise NotImplementedError
-        self._cmp_guard_class(op, arglocs, regalloc)
+            # XXX port from x86 backend once gc support is in place
 
     def emit_guard_not_invalidated(self, op, locs, regalloc):
         return self._emit_guard(op, locs, c.EQ, is_guard_not_invalidated=True)
diff --git a/pypy/jit/backend/ppc/regalloc.py b/pypy/jit/backend/ppc/regalloc.py
--- a/pypy/jit/backend/ppc/regalloc.py
+++ b/pypy/jit/backend/ppc/regalloc.py
@@ -456,14 +456,18 @@
     def prepare_guard_class(self, op):
         assert isinstance(op.getarg(0), Box)
         boxes = op.getarglist()
+
         x = self._ensure_value_is_boxed(boxes[0], boxes)
-        y = self.get_scratch_reg(REF, forbidden_vars=boxes)
+        y = self.get_scratch_reg(INT, forbidden_vars=boxes)
         y_val = rffi.cast(lltype.Signed, op.getarg(1).getint())
         self.assembler.load(y, imm(y_val))
+
         offset = self.cpu.vtable_offset
         assert offset is not None
-        offset_loc = self._ensure_value_is_boxed(ConstInt(offset), boxes)
+        assert _check_imm_arg(offset)
+        offset_loc = imm(offset)
         arglocs = self._prepare_guard(op, [x, y, offset_loc])
+
         return arglocs
 
     prepare_guard_nonnull_class = prepare_guard_class


More information about the pypy-commit mailing list