[pypy-commit] pypy ppc-jit-backend: Implemented a few guard operations.

hager noreply at buildbot.pypy.org
Fri Oct 21 16:06:01 CEST 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r48311:63cb14dbd14c
Date: 2011-10-21 16:05 +0200
http://bitbucket.org/pypy/pypy/changeset/63cb14dbd14c/

Log:	Implemented a few guard operations.

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
@@ -197,6 +197,23 @@
     def emit_guard_overflow(self, op, arglocs, regalloc):
         self._emit_ovf_guard(op, arglocs, c.EQ)
 
+    def emit_guard_value(self, op, arglocs, regalloc):
+        l0 = arglocs[0]
+        l1 = arglocs[1]
+        failargs = arglocs[2:]
+
+        if l0.is_reg():
+            if l1.is_imm():
+                self.mc.cmpi(l0.value, l1.getint())
+            else:
+                self.mc.cmp(l0.value, l1.value)
+        else:
+            assert 0, "not implemented yet"
+        self._emit_guard(op, failargs, c.NE)
+
+    emit_guard_nonnull = emit_guard_true
+    emit_guard_isnull = emit_guard_false
+
     def emit_finish(self, op, arglocs, regalloc):
         self.gen_exit_stub(op.getdescr(), op.getarglist(), arglocs)
 
@@ -213,6 +230,7 @@
                          descr._ppc_frame_manager_depth)
             regalloc.frame_manager.frame_depth = new_fd
 
+    # XXX adjust 64 bit
     def emit_setfield_gc(self, op, arglocs, regalloc):
         value_loc, base_loc, ofs, size = arglocs
         if size.value == 8:
@@ -235,6 +253,7 @@
         else:
             assert 0, "size not supported"
 
+    # XXX adjust 64 bit
     def emit_getfield_gc(self, op, arglocs, regalloc):
         base_loc, ofs, res, size = arglocs
         if size.value == 8:
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
@@ -272,6 +272,8 @@
         return args
 
     prepare_guard_false = prepare_guard_true
+    prepare_guard_nonnull = prepare_guard_true
+    prepare_guard_isnull = prepare_guard_true
 
     def prepare_guard_no_overflow(self, op):
         locs = self._prepare_guard(op)
@@ -280,6 +282,23 @@
 
     prepare_guard_overflow = prepare_guard_no_overflow
 
+    def prepare_guard_value(self, op):
+        boxes = list(op.getarglist())
+        b0, b1 = boxes
+        imm_b1 = _check_imm_arg(b1)
+        l0, box = self._ensure_value_is_boxed(b0, boxes)
+        boxes.append(box)
+        if not imm_b1:
+            l1, box = self._ensure_value_is_boxed(b1,boxes)
+            boxes.append(box)
+        else:
+            l1 = self.make_sure_var_in_reg(b1)
+        assert op.result is None
+        arglocs = self._prepare_guard(op, [l0, l1])
+        self.possibly_free_vars(boxes)
+        self.possibly_free_vars(op.getfailargs())
+        return arglocs
+
     def prepare_jump(self, op):
         descr = op.getdescr()
         assert isinstance(descr, LoopToken)


More information about the pypy-commit mailing list