[pypy-commit] pypy ppc-jit-backend: (edelsohn, bivab): Implement get_ and set_ interiorfileld operations

bivab noreply at buildbot.pypy.org
Fri Jan 13 12:30:07 CET 2012


Author: David Schneider <david.schneider at picle.org>
Branch: ppc-jit-backend
Changeset: r51295:6a95268fe8c5
Date: 2012-01-13 02:32 -0800
http://bitbucket.org/pypy/pypy/changeset/6a95268fe8c5/

Log:	(edelsohn, bivab): Implement get_ and set_ interiorfileld 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
@@ -537,6 +537,54 @@
     emit_getfield_raw_pure = emit_getfield_gc
     emit_getfield_gc_pure = emit_getfield_gc
 
+    def emit_getinteriorfield_gc(self, op, arglocs, regalloc):
+        (base_loc, index_loc, res_loc,
+            ofs_loc, ofs, itemsize, fieldsize) = arglocs
+        self.mc.load_imm(r.SCRATCH, itemsize.value)
+        self.mc.mullw(r.SCRATCH.value, index_loc.value, r.SCRATCH.value)
+        if ofs.value > 0:
+            if ofs_loc.is_imm():
+                self.mc.addic(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value)
+            else:
+                self.mc.add(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value)
+
+        if fieldsize.value == 8:
+            self.mc.ldx(res_loc.value, base_loc.value, r.SCRATCH.value)
+        elif fieldsize.value == 4:
+            self.mc.lwzx(res_loc.value, base_loc.value, r.SCRATCH.value)
+        elif fieldsize.value == 2:
+            self.mc.lhzx(res_loc.value, base_loc.value, r.SCRATCH.value)
+        elif fieldsize.value == 1:
+            self.mc.lbzx(res_loc.value, base_loc.value, r.SCRATCH.value)
+        else:
+            assert 0
+
+        #XXX Hack, Hack, Hack
+        if not we_are_translated():
+            signed = op.getdescr().fielddescr.is_field_signed()
+            self._ensure_result_bit_extension(res_loc, fieldsize.value, signed)
+
+    def emit_setinteriorfield_gc(self, op, arglocs, regalloc):
+        (base_loc, index_loc, value_loc,
+            ofs_loc, ofs, itemsize, fieldsize) = arglocs
+        self.mc.load_imm(r.SCRATCH, itemsize.value)
+        self.mc.mullw(r.SCRATCH.value, index_loc.value, r.SCRATCH.value)
+        if ofs.value > 0:
+            if ofs_loc.is_imm():
+                self.mc.addic(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value)
+            else:
+                self.mc.add(r.SCRATCH.value, r.SCRATCH.value, ofs_loc.value)
+        if fieldsize.value == 8:
+            self.mc.stdx(value_loc.value, base_loc.value, r.SCRATCH.value)
+        elif fieldsize.value == 4:
+            self.mc.stwx(value_loc.value, base_loc.value, r.SCRATCH.value)
+        elif fieldsize.value == 2:
+            self.mc.sthx(value_loc.value, base_loc.value, r.SCRATCH.value)
+        elif fieldsize.value == 1:
+            self.mc.stbx(value_loc.value, base_loc.value, r.SCRATCH.value)
+        else:
+            assert 0
+
 
 class ArrayOpAssembler(object):
     
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
@@ -602,6 +602,46 @@
     prepare_getfield_raw_pure = prepare_getfield_gc
     prepare_getfield_gc_pure = prepare_getfield_gc
 
+    def prepare_getinteriorfield_gc(self, op):
+        t = unpack_interiorfielddescr(op.getdescr())
+        ofs, itemsize, fieldsize, sign = t
+        args = op.getarglist()
+        base_loc, base_box = self._ensure_value_is_boxed(op.getarg(0), args)
+        index_loc, index_box = self._ensure_value_is_boxed(op.getarg(1), args)
+        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_vars_for_op(op)
+        self.possibly_free_var(base_box)
+        self.possibly_free_var(index_box)
+        self.free_temp_vars()
+        result_loc = self.force_allocate_reg(op.result)
+        self.possibly_free_var(op.result)
+        return [base_loc, index_loc, result_loc, ofs_loc, imm(ofs),
+                                    imm(itemsize), imm(fieldsize)]
+
+    def prepare_setinteriorfield_gc(self, op):
+        t = unpack_interiorfielddescr(op.getdescr())
+        ofs, itemsize, fieldsize, sign = t
+        args = op.getarglist()
+        base_loc, base_box = self._ensure_value_is_boxed(op.getarg(0), args)
+        index_loc, index_box  = self._ensure_value_is_boxed(op.getarg(1), args)
+        value_loc, value_box = self._ensure_value_is_boxed(op.getarg(2), args)
+        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(base_box)
+        self.possibly_free_var(index_box)
+        self.possibly_free_var(value_box)
+        return [base_loc, index_loc, value_loc, ofs_loc, imm(ofs),
+                                        imm(itemsize), imm(fieldsize)]
+
     def prepare_arraylen_gc(self, op):
         arraydescr = op.getdescr()
         assert isinstance(arraydescr, ArrayDescr)


More information about the pypy-commit mailing list