[pypy-commit] pypy ppc-jit-backend: Implemented GETFIELD_GC and SETFIELD_GC.

hager noreply at buildbot.pypy.org
Fri Oct 21 15:04:14 CEST 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r48308:528c82230eac
Date: 2011-10-21 15:03 +0200
http://bitbucket.org/pypy/pypy/changeset/528c82230eac/

Log:	Implemented GETFIELD_GC and SETFIELD_GC.

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
@@ -213,5 +213,49 @@
                          descr._ppc_frame_manager_depth)
             regalloc.frame_manager.frame_depth = new_fd
 
+    def emit_setfield_gc(self, op, arglocs, regalloc):
+        value_loc, base_loc, ofs, size = arglocs
+        if size.value == 8:
+            assert 0, "not implemented yet"
+        elif size.value == 4:
+            if ofs.is_imm():
+                self.mc.stw(value_loc.value, base_loc.value, ofs.value)
+            else:
+                self.mc.stw(value_loc.value, base_loc.value, ofs.value)
+        elif size.value == 2:
+            if ofs.is_imm():
+                self.mc.sth(value_loc.value, base_loc.value, ofs.value)
+            else:
+                self.mc.sthx(value_loc.value, base_loc.value, ofs.value)
+        elif size.value == 1:
+            if ofs.is_imm():
+                self.mc.stb(value_loc.value, base_loc.value, ofs.value)
+            else:
+                self.mc.stbx(value_loc.value, base_loc.value, ofs.value)
+        else:
+            assert 0, "size not supported"
+
+    def emit_getfield_gc(self, op, arglocs, regalloc):
+        base_loc, ofs, res, size = arglocs
+        if size.value == 8:
+            assert 0, "not implemented yet"
+        elif size.value == 4:
+            if ofs.is_imm():
+                self.mc.lwz(res.value, base_loc.value, ofs.value)
+            else:
+                self.mc.lwzx(res.value, base_loc.value, ofs.value)
+        elif size.value == 2:
+            if ofs.is_imm():
+                self.mc.lhz(res.value, base_loc.value, ofs.value)
+            else:
+                self.mc.lhzx(res.value, base_loc.value, ofs.value)
+        elif size.value == 1:
+            if ofs.is_imm():
+                self.mc.lbz(res.value, base_loc.value, ofs.value)
+            else:
+                self.mc.lbzx(res.value, base_loc.value, ofs.value)
+        else:
+            assert 0, "size not supported"
+
     def nop(self):
         self.mc.ori(0, 0, 0)
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
@@ -12,6 +12,8 @@
                                                          prepare_unary_cmp)
 from pypy.jit.metainterp.history import (INT, REF, FLOAT, Const, ConstInt, 
                                          ConstPtr, LoopToken)
+from pypy.jit.backend.llsupport.descr import BaseFieldDescr, BaseArrayDescr, \
+                                             BaseCallDescr, BaseSizeDescr
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.backend.ppc.ppcgen import locations
 from pypy.rpython.lltypesystem import rffi, lltype
@@ -293,6 +295,47 @@
                                  [], [], None)
         return []
 
+    def prepare_setfield_gc(self, op):
+        boxes = list(op.getarglist())
+        b0, b1 = boxes
+        ofs, size, ptr = self._unpack_fielddescr(op.getdescr())
+        base_loc, base_box = self._ensure_value_is_boxed(b0, boxes)
+        boxes.append(base_box)
+        value_loc, value_box = self._ensure_value_is_boxed(b1, boxes)
+        boxes.append(value_box)
+        c_ofs = ConstInt(ofs)
+        if _check_imm_arg(c_ofs):
+            ofs_loc = imm(ofs)
+        else:
+            ofs_loc, ofs_box = self._ensure_value_is_boxed(c_ofs, boxes)
+            boxes.append(ofs_box)
+        self.possibly_free_vars(boxes)
+        return [value_loc, base_loc, ofs_loc, imm(size)]
+
+    def prepare_getfield_gc(self, op):
+        a0 = op.getarg(0)
+        ofs, size, ptr = self._unpack_fielddescr(op.getdescr())
+        base_loc, base_box = self._ensure_value_is_boxed(a0)
+        c_ofs = ConstInt(ofs)
+        if _check_imm_arg(c_ofs):
+            ofs_loc = imm(ofs)
+        else:
+            ofs_loc, ofs_box = self._ensure_value_is_boxed(c_ofs, [base_box])
+            self.possibly_free_var(ofs_box)
+        self.possibly_free_var(a0)
+        self.possibly_free_var(base_box)
+        res = self.force_allocate_reg(op.result)
+        self.possibly_free_var(op.result)
+        return [base_loc, ofs_loc, res, imm(size)]
+
+    # from ../x86/regalloc.py:791
+    def _unpack_fielddescr(self, fielddescr):
+        assert isinstance(fielddescr, BaseFieldDescr)
+        ofs = fielddescr.offset
+        size = fielddescr.get_field_size(self.cpu.translate_support_code)
+        ptr = fielddescr.is_pointer_field()
+        return ofs, size, ptr
+
 def make_operation_list():
     def not_implemented(self, op, *args):
         raise NotImplementedError, op


More information about the pypy-commit mailing list