Author: hager <sven.ha...@uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r48407:7c2f8272c677
Date: 2011-10-25 09:46 +0200
http://bitbucket.org/pypy/pypy/changeset/7c2f8272c677/

Log:    Implemented STRLEN, STRGETITEM, STRSETITEM.

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
@@ -371,5 +371,32 @@
             signed = descr.is_item_signed()
             self._ensure_result_bit_extension(res, size, signed)
 
+    # XXX 64 bit adjustment needed
+    def emit_strlen(self, op, arglocs, regalloc):
+        l0, l1, res = arglocs
+        if l1.is_imm():
+            self.mc.lwz(res.value, l0.value, l1.getint())
+        else:
+            self.mc.lwzx(res.value, l0.value, l1.value)
+
+    def emit_strgetitem(self, op, arglocs, regalloc):
+        res, base_loc, ofs_loc, basesize = arglocs
+        if ofs_loc.is_imm():
+            self.mc.addi(res.value, base_loc.value, ofs_loc.getint())
+        else:
+            self.mc.add(res.value, base_loc.value, ofs_loc.value)
+        
+        self.mc.load_imm(r.r0, basesize.value)
+        self.mc.lbzx(res.value, res.value, r.r0.value)
+
+    def emit_strsetitem(self, op, arglocs, regalloc):
+        value_loc, base_loc, ofs_loc, basesize = arglocs
+        if ofs_loc.is_imm():
+            self.mc.addi(base_loc.value, base_loc.value, ofs_loc.getint())
+        else:
+            self.mc.add(base_loc.value, base_loc.value, ofs_loc.value)
+        self.mc.load_imm(r.r0, basesize.value)
+        self.mc.stbx(value_loc.value, base_loc.value, r.r0.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
@@ -16,7 +16,8 @@
                                              BaseCallDescr, BaseSizeDescr
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.backend.ppc.ppcgen import locations
-from pypy.rpython.lltypesystem import rffi, lltype
+from pypy.rpython.lltypesystem import rffi, lltype, rstr
+from pypy.jit.backend.llsupport import symbolic
 import pypy.jit.backend.ppc.ppcgen.register as r
 
 class TempInt(TempBox):
@@ -413,6 +414,67 @@
         self.possibly_free_var(op.result)
         return [res, base_loc, ofs_loc, imm(scale), imm(ofs)]
 
+    def prepare_strlen(self, op):
+        l0, box = self._ensure_value_is_boxed(op.getarg(0))
+        boxes = [box]
+
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
+                                         self.cpu.translate_support_code)
+        ofs_box = ConstInt(ofs_length)
+        imm_ofs = _check_imm_arg(ofs_box)
+
+        if imm_ofs:
+            l1 = self.make_sure_var_in_reg(ofs_box, boxes)
+        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_strgetitem(self, op):
+        boxes = list(op.getarglist())
+        base_loc, box = self._ensure_value_is_boxed(boxes[0])
+        boxes.append(box)
+
+        a1 = boxes[1]
+        imm_a1 = _check_imm_arg(a1)
+        if imm_a1:
+            ofs_loc = self.make_sure_var_in_reg(a1, boxes)
+        else:
+            ofs_loc, box = self._ensure_value_is_boxed(a1, 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.STR,
+                                         self.cpu.translate_support_code)
+        assert itemsize == 1
+        return [res, base_loc, ofs_loc, imm(basesize)]
+
+    def prepare_strsetitem(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.STR,
+                                         self.cpu.translate_support_code)
+        assert itemsize == 1
+        return [value_loc, base_loc, ofs_loc, imm(basesize)]
+
     # from ../x86/regalloc.py:791
     def _unpack_fielddescr(self, fielddescr):
         assert isinstance(fielddescr, BaseFieldDescr)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to