Author: hager <sven.ha...@uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r46883:500d9ed3d490
Date: 2011-08-29 14:54 +0200
http://bitbucket.org/pypy/pypy/changeset/500d9ed3d490/

Log:    Implemented STRLEN, STRGETITEM, STRSETITEM. Works for
        test_basic_string, but is not complete yet.

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
@@ -8,7 +8,8 @@
 from pypy.jit.metainterp.history import Const, ConstPtr
 from pypy.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin
 from pypy.jit.backend.llsupport.asmmemmgr import AsmMemoryManager
-from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.jit.backend.llsupport import symbolic
+from pypy.rpython.lltypesystem import lltype, rffi, rstr
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.metainterp.history import BoxInt, ConstInt, Box
 
@@ -1171,6 +1172,10 @@
         self.li(free_reg, 0)
         self.adde(free_reg, free_reg, free_reg)
 
+    # *************************************************
+    #            FIELD  AND  ARRAY  OPS               *
+    # *************************************************
+
     def emit_setfield_gc(self, op, cpu):
         args = op.getarglist()
         fptr = args[0]
@@ -1336,6 +1341,50 @@
     def emit_getarrayitem_gc_pure(self, op, cpu):
         self.emit_getarrayitem_gc(op, cpu)
 
+    def emit_strlen(self, op, cpu):
+        args = op.getarglist()
+        base_box = args[0]
+        base_reg = cpu.reg_map[base_box]
+        free_reg = cpu.next_free_register
+        if IS_PPC_32:
+            self.lwz(free_reg, base_reg, 4)
+        else:
+            assert 0, "not implemented yet"
+        result = op.result
+        cpu.reg_map[result] = free_reg
+        cpu.next_free_register += 1
+
+    def emit_strgetitem(self, op, cpu):
+        args = op.getarglist()
+        ptr_box = args[0]
+        offset_box = args[1]
+        ptr_reg = cpu.reg_map[ptr_box]
+        offset_reg = cpu.reg_map[offset_box]
+        free_reg = cpu.next_free_register
+        basesize, itemsize, _ = symbolic.get_array_token(rstr.STR,
+                                cpu.translate_support_code)
+        assert itemsize == 1
+        self.addi(ptr_reg, ptr_reg, basesize)
+        self.lbzx(free_reg, ptr_reg, offset_reg)
+        result = op.result
+        cpu.reg_map[result] = free_reg
+        cpu.next_free_register += 1
+
+    def emit_strsetitem(self, op, cpu):
+        args = op.getarglist()
+        ptr_box = args[0]
+        offset_box = args[1]
+        value_box = args[2]
+
+        ptr_reg = cpu.reg_map[ptr_box]
+        offset_reg = cpu.reg_map[offset_box]
+        value_reg = cpu.reg_map[value_box]
+        basesize, itemsize, _ = symbolic.get_array_token(rstr.STR,
+                                cpu.translate_support_code)
+        assert itemsize == 1
+        self.addi(ptr_reg, ptr_reg, basesize)
+        self.stbx(value_reg, ptr_reg, offset_reg)
+
     ############################
     # unary integer operations #
     ############################
@@ -1463,6 +1512,8 @@
         self.mfcr(free_reg)
         self.rlwinm(free_reg, free_reg, 4, 31, 31)
 
+    #_____________________________________
+
     def emit_finish(self, op, cpu):
         descr = op.getdescr()
         identifier = self._get_identifier_from_descr(descr, cpu)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to