Author: hager <[email protected]>
Branch: ppc-jit-backend
Changeset: r48422:ef1c13357210
Date: 2011-10-25 11:25 +0200
http://bitbucket.org/pypy/pypy/changeset/ef1c13357210/

Log:    Implemented UNICODEGETITEM, UNICODESETITEM, UNICODELEN.

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
@@ -398,5 +398,40 @@
         self.mc.load_imm(r.r0, basesize.value)
         self.mc.stbx(value_loc.value, base_loc.value, r.r0.value)
 
+    emit_unicodelen = emit_strlen
+
+    # XXX 64 bit adjustment
+    def emit_unicodegetitem(self, op, arglocs, regalloc):
+        res, base_loc, ofs_loc, scale, basesize, itemsize = arglocs
+
+        # XXX arrrrgh, why does PPC not have an SLWI instruction ?
+        self.mc.li(r.r0.value, scale.value)
+        self.mc.slw(ofs_loc.value, ofs_loc.value, r.r0.value)
+        self.mc.add(res.value, base_loc.value, ofs_loc.value)
+        self.mc.li(r.r0.value, basesize.value)
+
+        if scale.value == 2:
+            self.mc.lwzx(res.value, res.value, r.r0.value)
+        elif scale.value == 1:
+            self.mc.lhzx(res.value, res.value, r.r0.value)
+        else:
+            assert 0, itemsize.value
+
+    # XXX 64 bit adjustment
+    def emit_unicodesetitem(self, op, arglocs, regalloc):
+        value_loc, base_loc, ofs_loc, scale, basesize, itemsize = arglocs
+
+        self.mc.li(r.r0.value, scale.value)
+        self.mc.slw(ofs_loc.value, ofs_loc.value, r.r0.value)
+        self.mc.add(base_loc.value, base_loc.value, ofs_loc.value)
+        self.mc.li(r.r0.value, basesize.value)
+
+        if scale.value == 2:
+            self.mc.stwx(value_loc.value, base_loc.value, r.r0.value)
+        elif scale.value == 1:
+            self.mc.sthx(value_loc.value, base_loc.value, r.r0.value)
+        else:
+            assert 0, itemsize.value
+
     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
@@ -475,6 +475,57 @@
         assert itemsize == 1
         return [value_loc, base_loc, ofs_loc, imm(basesize)]
 
+    def prepare_unicodelen(self, op):
+        l0, box = self._ensure_value_is_boxed(op.getarg(0))
+        boxes = [box]
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+                                         self.cpu.translate_support_code)
+        ofs_box = ConstInt(ofs_length)
+        imm_ofs = _check_imm_arg(ofs_box)
+
+        if imm_ofs:
+            l1 = imm(ofs_length)
+        else:
+            l1, box1 = self._ensure_value_is_boxed(ofs_box, boxes)
+            boxes.append(box1)
+
+        self.possibly_free_vars(boxes)
+        res = self.force_allocate_reg(op.result)
+        self.possibly_free_var(op.result)
+        return [l0, l1, res]
+
+    def prepare_unicodegetitem(self, op):
+        boxes = list(op.getarglist())
+        base_loc, box = self._ensure_value_is_boxed(boxes[0], boxes)
+        boxes.append(box)
+        ofs_loc, box = self._ensure_value_is_boxed(boxes[1], boxes)
+        boxes.append(box)
+        self.possibly_free_vars(boxes)
+
+        res = self.force_allocate_reg(op.result)
+        self.possibly_free_var(op.result)
+
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+                                         self.cpu.translate_support_code)
+        scale = itemsize/2
+        return [res, base_loc, ofs_loc, imm(scale), imm(basesize), 
imm(itemsize)]
+
+    def prepare_unicodesetitem(self, op):
+        boxes = list(op.getarglist())
+        base_loc, box = self._ensure_value_is_boxed(boxes[0], boxes)
+        boxes.append(box)
+        ofs_loc, box = self._ensure_value_is_boxed(boxes[1], boxes)
+        boxes.append(box)
+        value_loc, box = self._ensure_value_is_boxed(boxes[2], boxes)
+        boxes.append(box)
+
+        self.possibly_free_vars(boxes)
+
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+                                         self.cpu.translate_support_code)
+        scale = itemsize/2
+        return [value_loc, base_loc, ofs_loc, imm(scale), imm(basesize), 
imm(itemsize)]
+
     # from ../x86/regalloc.py:791
     def _unpack_fielddescr(self, fielddescr):
         assert isinstance(fielddescr, BaseFieldDescr)
diff --git a/pypy/jit/backend/test/runner_test.py 
b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -1056,6 +1056,9 @@
         r = self.execute_operation(rop.UNICODEGETITEM, [u_box, BoxInt(5)],
                                    'int')
         assert r.value == 0x1234
+        r = self.execute_operation(rop.UNICODEGETITEM, [u_box, BoxInt(4)],
+                                   'int')
+        assert r.value == 0x6F # 0x6F = 'o'
         r = self.execute_operation(rop.UNICODESETITEM, [u_box, BoxInt(4),
                                                         BoxInt(31313)], 'void')
         assert r is None
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to