Author: hager <[email protected]>
Branch: ppc-jit-backend
Changeset: r48378:155a57d1d251
Date: 2011-10-24 17:52 +0200
http://bitbucket.org/pypy/pypy/changeset/155a57d1d251/

Log:    Implemented basic array 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
@@ -5,6 +5,7 @@
 from pypy.jit.backend.ppc.ppcgen.arch import GPR_SAVE_AREA, IS_PPC_32, WORD
 
 from pypy.jit.metainterp.history import LoopToken, AbstractFailDescr
+from pypy.rlib.objectmodel import we_are_translated
 
 class GuardToken(object):
     def __init__(self, descr, failargs, faillocs, offset, fcond=c.NE,
@@ -303,5 +304,66 @@
         else:
             assert 0, "size not supported"
 
+    # XXX 64 bit adjustment
+    def emit_arraylen_gc(self, op, arglocs, regalloc):
+        res, base_loc, ofs = arglocs
+        self.mc.lwz(res.value, base_loc.value, ofs.value)
+
+    # XXX 64 bit adjustment
+    def emit_setarrayitem_gc(self, op, arglocs, regalloc):
+        value_loc, base_loc, ofs_loc, scale, ofs = arglocs
+        if scale.value > 0:
+            scale_loc = r.r0
+            self.mc.load_imm(r.r0, scale.value)
+            self.mc.slw(r.r0.value, ofs_loc.value, r.r0.value)
+        else:
+            scale_loc = ofs_loc
+
+        if ofs.value > 0:
+            self.mc.addi(r.r0.value, scale_loc.value, ofs.value)
+            scale_loc = r.r0
+
+        if scale.value == 3:
+            assert 0, "not implemented yet"
+        elif scale.value == 2:
+            self.mc.stwx(value_loc.value, base_loc.value, scale_loc.value)
+        elif scale.value == 1:
+            self.mc.sthx(value_loc.value, base_loc.value, scale_loc.value)
+        elif scale.value == 0:
+            self.mc.stbx(value_loc.value, base_loc.value, scale_loc.value)
+        else:
+            assert 0, "scale %s not supported" % (scale.value)
+
+    # XXX 64 bit adjustment
+    def emit_getarrayitem_gc(self, op, arglocs, regalloc):
+        res, base_loc, ofs_loc, scale, ofs = arglocs
+        if scale.value > 0:
+            scale_loc = r.r0
+            self.mc.load_imm(r.r0, scale.value)
+            self.mc.slw(r.r0.value, ofs_loc.value, scale.value)
+        else:
+            scale_loc = ofs_loc
+        if ofs.value > 0:
+            self.mc.addi(r.r0.value, scale_loc.value, ofs.value)
+            scale_loc = r.r0
+
+        if scale.value == 3:
+            assert 0, "not implemented yet"
+        elif scale.value == 2:
+            self.mc.lwzx(res.value, base_loc.value, scale_loc.value)
+        elif scale.value == 1:
+            self.mc.lhzx(res.value, base_loc.value, scale_loc.value)
+        elif scale.value == 0:
+            self.mc.lbzx(res.value, base_loc.value, scale_loc.value)
+        else:
+            assert 0
+
+        #XXX Hack, Hack, Hack
+        if not we_are_translated():
+            descr = op.getdescr()
+            size =  descr.get_item_size(False)
+            signed = descr.is_item_signed()
+            self._ensure_result_bit_extension(res, size, signed)
+
     def nop(self):
         self.mc.ori(0, 0, 0)
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py 
b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -652,6 +652,27 @@
             assert 0, "not supported location"
         assert 0, "not supported location"
 
+    def _ensure_result_bit_extension(self, resloc, size, signed):
+        if size == 4:
+            return
+        if size == 1:
+            if not signed: #unsigned char
+                self.mc.load_imm(r.r0, 0xFF)
+                self.mc.and_(resloc.value, resloc.value, r.r0.value)
+            else:
+                self.mc.load_imm(r.r0, 24)
+                self.mc.slw(resloc.value, resloc.value, r.r0.value)
+                self.mc.sraw(resloc.value, resloc.value, r.r0.value)
+        elif size == 2:
+            if not signed:
+                self.mc.load_imm(r.r0, 16)
+                self.mc.slw(resloc.value, resloc.value, r.r0.value)
+                self.mc.srw(resloc.value, resloc.value, r.r0.value)
+            else:
+                self.mc.load_imm(r.r0, 16)
+                self.mc.slw(resloc.value, resloc.value, r.r0.value)
+                self.mc.sraw(resloc.value, resloc.value, r.r0.value)
+
 def make_operations():
     def not_implemented(builder, trace_op, cpu, *rest_args):
         raise NotImplementedError, trace_op
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
@@ -374,6 +374,45 @@
         self.possibly_free_var(op.result)
         return [base_loc, ofs_loc, res, imm(size)]
 
+    def prepare_arraylen_gc(self, op):
+        arraydescr = op.getdescr()
+        assert isinstance(arraydescr, BaseArrayDescr)
+        ofs = arraydescr.get_ofs_length(self.cpu.translate_support_code)
+        arg = op.getarg(0)
+        base_loc, base_box = self._ensure_value_is_boxed(arg)
+        self.possibly_free_vars([arg, base_box])
+
+        res = self.force_allocate_reg(op.result)
+        self.possibly_free_var(op.result)
+        return [res, base_loc, imm(ofs)]
+
+    def prepare_setarrayitem_gc(self, op):
+        b0, b1, b2 = boxes = list(op.getarglist())
+        _, scale, ofs, _, ptr = self._unpack_arraydescr(op.getdescr())
+
+        base_loc, base_box  = self._ensure_value_is_boxed(b0, boxes)
+        boxes.append(base_box)
+        ofs_loc, ofs_box = self._ensure_value_is_boxed(b1, boxes)
+        boxes.append(ofs_box)
+        #XXX check if imm would be fine here
+        value_loc, value_box = self._ensure_value_is_boxed(b2, boxes)
+        boxes.append(value_box)
+        self.possibly_free_vars(boxes)
+        return [value_loc, base_loc, ofs_loc, imm(scale), imm(ofs)]
+
+    def prepare_getarrayitem_gc(self, op):
+        a0, a1 = boxes = list(op.getarglist())
+        _, scale, ofs, _, ptr = self._unpack_arraydescr(op.getdescr())
+
+        base_loc, base_box  = self._ensure_value_is_boxed(a0, boxes)
+        boxes.append(base_box)
+        ofs_loc, ofs_box = self._ensure_value_is_boxed(a1, boxes)
+        boxes.append(ofs_box)
+        self.possibly_free_vars(boxes)
+        res = self.force_allocate_reg(op.result)
+        self.possibly_free_var(op.result)
+        return [res, base_loc, ofs_loc, imm(scale), imm(ofs)]
+
     # from ../x86/regalloc.py:791
     def _unpack_fielddescr(self, fielddescr):
         assert isinstance(fielddescr, BaseFieldDescr)
@@ -382,6 +421,22 @@
         ptr = fielddescr.is_pointer_field()
         return ofs, size, ptr
 
+    # from ../x86/regalloc.py:779
+    def _unpack_arraydescr(self, arraydescr):
+        assert isinstance(arraydescr, BaseArrayDescr)
+        cpu = self.cpu
+        ofs_length = arraydescr.get_ofs_length(cpu.translate_support_code)
+        ofs = arraydescr.get_base_size(cpu.translate_support_code)
+        size = arraydescr.get_item_size(cpu.translate_support_code)
+        ptr = arraydescr.is_array_of_pointers()
+        scale = 0
+        # XXX HACK, improve!
+        if not arraydescr._clsname.startswith("BoolArrayDescr"):
+            while (1 << scale) < size:
+                scale += 1
+            assert (1 << scale) == size
+        return size, scale, ofs, ofs_length, ptr
+
 def make_operation_list():
     def not_implemented(self, op, *args):
         raise NotImplementedError, op
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to